Problem 1320 Ones
Accept: 567 Submit: 1996
Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem Description
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.
Input
There are multiple test cases. Each case contains only one line containing a integer N
Output
For each case, output the minimal number of 1s you need to get N.
Sample Input
210
Sample Output
27
Source
chenyan输出最少需要一个1
很水的一道题,重新开始刷我的DP
状态转移方程为:dp[i] = min(dp[j]+dp[i/j]+dp[i%j])
代码如下:
#include <cstdio>
#include <iostream>
#include <algorithm>
#define MAXN 10010
using namespace std;
int dp[MAXN];
void init(int n) {
for(int i=1; i<=n; ++i) {
dp[i] = i;
}
dp[0] = 0;
for(int i=1; i<=n; ++i) {
for(int j=1; j<=i; ++j) {
dp[i] = min(dp[i%j]+dp[j]+dp[i/j], dp[i]);
}
}
}
int main(void) {
init(10010);
int n;
while(scanf("%d", &n) != EOF) {
printf("%d\n", dp[n]);
}
return 0;
}