首页 > 代码库 > UESTC 876 爱管闲事
UESTC 876 爱管闲事
题意:即求给定n个数字(a1,a2,……an),不改变序列,分成M份,使每一份和的乘积最大。
思路:dp[i][j]表示把前i个数字,分成j份所能得到的最大乘积。
转移方程:dp[i][j] = max{ dp[k][i-1]*sum(k+1,j) } 其中显然j<=i(分成j份,至少要有i个数才能分)且i-1<=k<j
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 10007 int a[22],dp[22][22],sum[22]; int SUM(int l,int r) { return sum[r]-sum[l-1]; } int main() { int t,i,n,m,j,k; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); sum[0] = 0; for(i=1;i<=n;i++) { scanf("%d",&a[i]); sum[i] = sum[i-1] + a[i]; } for(i=0;i<=21;i++) { for(j=0;j<=i;j++) dp[i][j] = 1; for(j=i+1;j<=21;j++) dp[i][j] = 0; } for(i=1;i<=n;i++) { int s = 1; for(j=1;j<=i;j++) s *= a[j]; dp[i][i] = s; } for(i=1;i<=n;i++) { for(j=1;j<=i;j++) { int maxi = -1; for(k=j-1;k<i;k++) { maxi = max(maxi,dp[k][j-1]*SUM(k+1,i)); } dp[i][j] = max(maxi,dp[i][j]); } } printf("%d\n",dp[n][m]); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。