抄的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;
}