抄的Bill_utada的代码,链接:http://blog.csdn.net/Area_52/article/details/43540097
以及参考了Tc_To_Top的文章,链接:http://blog.csdn.net/Tc_To_Top/article/details/40951263
得好好记录下,因为之前没做过DP(dynamic programming动态规划法)的题目。
不看以上两位的博客,真的想不到这个办法,在这做一会事后诸葛亮。
设数字串1234,K=2;
dp[1][0] = 1 dp[2][0] = 12 dp[3][0] = 123 dp[4][0] = 1234; 可以直接得到(dp[i][0]的初始化)
之后
dp[2][1] = dp[1][0] * ans(2,2) dp[3][1] = max(dp[1][0]*ans(2,3) , dp[2][0]*ans(3,3))
dp[4][1] = max(三项...)
后一步,均可由前一步的结果推导出。
猜测,像这种类型的问题,可以记录下每一步的结果,然后由这个结果推导出下一步的结果。最终解决大问题。
我的代码
#include<stdio.h> #include<string.h> #define MAXN 50 int s[MAXN]; char tmp[MAXN]; __int64 dp[MAXN][MAXN]; __int64 ans(int start,int end) { __int64 temp = 0; int i; for(i=start;i<=end;i++) { temp *= 10; temp += s[i]; } return temp; } __int64 max(int i,int j) { int p; __int64 tmp = -1; for(p=1;p<i;p++) { if(tmp < dp[p][j-1]*ans(p,i-1)) tmp = dp[p][j-1]*ans(p,i-1); } return tmp; } int main() { int i,k,j; int n; scanf("%d %d",&n,&k); scanf("%s",tmp); for(i=0;i<n;i++) { s[i] = tmp[i] - '0'; } //dp初始化 for(i=1;i<=n;i++) dp[i][0] = ans(0,i-1); for(j=1;j<=k;j++) for(i = j+1;i<=n;i++) { dp[i][j] = max(i,j); // printf("%d %d %I64d\n",i,j,dp[i][j]); } printf("%I64d\n",dp[n][k]); return 0; }