http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1204
中文题意。
先处理前缀和,然后枚举区间dp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
char s[55];
long long sum[55][55],dp[55][10];
int main(){
long long n,k,i,j,p;
freopen("max.in", "r", stdin);
freopen("max.out", "w", stdout);
while(scanf("%I64d%I64d",&n,&k)!=EOF){
scanf("%s",s+1);
for(i=1;i<=n;i++){
sum[i][i]=s[i]-'0';
for(j=i+1;j<=n;j++)
sum[i][j]=sum[i][j-1]*10+s[j]-'0';
}
k++;
memset(dp,0,sizeof(dp));
for(i=1;i<n;i++)
dp[i][1]=sum[1][i];
for(i=1;i<=n;i++){
for(j=2;j<=min(i,k);j++){
for(p=max(1ll,j-1);p<=i-1;p++){
dp[i][j]=max(dp[i][j],dp[p][j-1]*sum[p+1][i]);
}
}
}
printf("%I64d\n",dp[n][k]);
}
return 0;
}