nyoj-0708-ones(dp)

时间:2023-03-09 01:03:54
nyoj-0708-ones(dp)

nyoj-0708-ones

题意:用1,+,*,(,). 这四个符号组成表达式表达数s(0 <= s <= 10000),且1最少时1的的个数

状态转移方程: dp[i] = min(dp[i-1] + 1, dp[j] + dp[i-j]);

代码:

#include<bits/stdc++.h>
using namespace std;
const int N = ;
int dp[N];
int main() {
fill(dp, dp + N, );
dp[] = ; dp[] = ;
for(int i = ; i <= ; i++) {
int t = (int)sqrt(i);
dp[i] = dp[i-] + ;
for(int j = i - ; j >= t; j--) {
if(i % j == ) dp[i] = min(dp[i], dp[j] + dp[i/j]);
}
}
int n;
while(scanf("%d", &n) != EOF) {
printf("%d\n", dp[n]);
}
return ;
}