标签:
4 2
1231
62
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; int f[45][45],sum[45][45],N,M; int main(){ // freopen("01.txt","r",stdin); scanf("%d%d",&N,&M); string s; cin>>s; for(int i=0;i<N;i++){sum[i+1][i+1]=int(s[i]-‘0‘);} for(int i=1;i<=N;i++) for(int j=i+1;j<=N;j++) sum[i][j]=sum[i][j-1]*10+sum[j][j]; for(int i=1;i<=N;i++) f[i][0]=sum[1][i]; for(int i=1;i<=M;i++){ for(int j=i+1;j<=N;j++){ for(int k=i;k<j;k++){ f[j][i]=max(f[j][i],f[k][i-1]*sum[k+1][j]); } } } printf("%d\n",f[N][M]); return 0; }几个点讲一下:
1)用字符串输入,不用逆序存sum数组;
2)sum数组用来打表,sum[i][j]表示i到j的数值,如79123中,sum[2][5]=9123,sum[1][2]=79;
3)之前一直做的都是模板类的dp,看到这一题是蒙蔽的,抄了好多题解和blog才大概知道怎么写;
4)f[j][i]表示j个数用i个乘号分开的最大值.
标签:
原文地址:http://www.cnblogs.com/radiumlrb/p/5782800.html