| |||
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; __int64 dp[20][20]; int sum[20][20]; int a[20]; //dp[i][j]表示(1,i)中有j个乘号 dp[i][j]=max(dp[k][j-1]*sum[k+1][j]);(j<=k<i) int main() { int n,k; while(scanf("%d%d",&n,&k)==2) { for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) { for(int j=i;j<=n;j++) { int cnt=0; for(int k=i;k<=j;k++) cnt+=a[k]; sum[i][j]=cnt; } } for(int i=1;i<=n;i++) dp[i][0]=sum[1][i]; for(int j=1;j<=k;j++) { for(int i=j+1;i<=n;i++) { dp[i][j]=-1; for(int k=j;k<i;k++) { dp[i][j]=max(dp[i][j],dp[k][j-1]*sum[k+1][i]); } } } printf("%I64d/n",dp[n][k]); } return 0; } |