ones
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
Given a positive integer N (0<=N<=10000), you are to find an expression equals to N using only 1,+,*,(,). 1 should not appear continuously, i.e. 11+1 is not allowed.
-
输入
- There are multiple test cases. Each case contains only one line containing a integer N 输出
- For each case, output the minimal number of 1s you need to get N. 样例输入
-
2 10
样例输出
-
2 7
-
-
线性dp。显然,如果一个数是素数,就满足dp[i]=dp[i-1]+1。否则就通过因子相乘来缩小dp值,dp[i]=d[i/j]+dp[j] (i%j==0)。显然遍历到了j,就没有必要遍历 i/j 了,所以只需要搜较小的因子。即j*j<=i。
-
代码:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int dp[10005]; int main() { int n; while(~scanf("%d",&n)) { memset(dp,0,sizeof dp); dp[1]=1; for(int i=2;i<=n;i++) { dp[i]=dp[i-1]+1; for(int j=2;j*j<=i;j++) if(i%j==0 && dp[i/j]+dp[j]<dp[i]) dp[i]=dp[i/j]+dp[j]; } printf("%d\n",dp[n]); } return 0; }