还是经典问题,权当复习。
/*
* tyvj-1047
* mike-w
* 2011-11-6
* --------------
* 和1045类似
* --------------
* DP经典问题
* --------------
* 扫了一眼DISCUSS
* 不用高精度 :)
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max(a,b) ((a)>(b)?(a):(b))
#define MAXN 45
#define MAXK 10
int N,K;
int num[MAXN];
long opt[MAXN][MAXK];
long s[MAXN][MAXN];
char buf[MAXN];
int main(void)
{
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
#endif
int i,j,k;
scanf("%d%d",&N,&K);
scanf("%s",buf);
for(i=0;buf[i];i++)
num[i+1]=buf[i]-'0';
for(i=1;i<=N;i++)
for(j=i;j<=N;j++)
s[i][j]=10*s[i][j-1]+num[j];
for(i=1;i<=N;i++)
opt[i][0]=s[1][i];
for(i=2;i<=N;i++)
for(j=1;j<=K;j++)
for(k=1;k<i;k++)
opt[i][j]=max(opt[i][j],opt[k][j-1]*s[k+1][i]);
printf("%ld\n",opt[N][K]);
return 0;
}
2005

被折叠的 条评论
为什么被折叠?



