| |||
#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; } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
本文介绍了一个算法问题,目标是在给定数字和乘法操作次数的约束下找到能够产生的最大计算结果。通过动态规划的方法预先计算不同组合的累加和,并在此基础上进一步计算最优解。
9834

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



