设为首页 加入收藏

TOP

[ACM] n个数分为m部分,要求每部分的和乘起来积最大(区间DP)
2015-07-24 07:12:27 来源: 作者: 【 】 浏览:76
Tags:ACM 个数分为 m部分 要求 部分 起来 最大 区间

A - 爱管闲事

春希非常爱管闲事,他每天都会抽空帮助一些同学,由于春希非常死板,出于公平性,春希不会先帮助后来找他的同学。

现在有 n 个同学需要他的帮助,虽然他很想一天之类帮助所有人,但毕竟精力有限,于是他决定分 m 天来帮助他们。

根据事情的重要性,春希帮助不同同学会有不同的快乐值,而春希获得的总的快乐值为每天获得的快乐值的乘积。

现在给出 n m ,以及帮助完各同学时获得的快乐值,求春希能获得的最大快乐值。

Input

第一行为一个整数 T ,代表数据组数。

每组数据,第一行两个整数 n,m 。表示需要帮助的同学的数量,和天数。 (1≤m≤min(n,10),1≤n≤20)

第二行为 n 个整数,表示帮助这个同学的获得的快乐值,每个快乐值不大于 5

Output

每组数据输出一行,一个整数,表示最大的快乐值。

Sample input and output

Sample Input Sample Output
1
5 3
3 2 1 4 5
125
解题思路: dp[j][i]表示前j个数分为i部分的和的乘积的最大值。测试用例中(3+2)*(1+4)*5=125 三重循环。 dp[j][i]=max(dp[j][i],dp[k][i-1]*(sum[j]-sum[k])); 关键代码:
for(int i=1;i<=m;i++)
            for(int j=n;j>=i;j--)
                for(int k=i-1;k
  
   
代码:
#include 
    
     
#include 
     
       #include 
      
        using namespace std; const int maxn=25; int dp[maxn][maxn]; int num[maxn],sum[maxn]; int t,n,m; int main() { cin>>t; while(t--) { cin>>n>>m; for(int i=0;i<=n;i++) for(int j=0;j<=m;j++) dp[i][j]=1; sum[0]=0; for(int i=1;i<=n;i++) { cin>>num[i]; sum[i]=sum[i-1]+num[i]; } for(int i=1;i<=m;i++) for(int j=n;j>=i;j--) for(int k=i-1;k
       
        一开始写的一维的,可是一直WA,不知道为什么,求解。 错误的一维代码: 
        
#include 
         
          
#include 
          
            #include 
           
             using namespace std; int sum[25]; int num[25]; int dp[25]; int t; int n,m; int main() { cin>>t; while(t--) { sum[0]=0; dp[0]=1; cin>>n>>m; for(int i=1;i<=n;i++) { cin>>num[i]; sum[i]=sum[i-1]+num[i]; dp[i]=1; } for(int i=1;i<=m;i++) { for(int j=n;j>=i;j--) { for(int k=i-1;k
            
             





】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇深入学习python (七) 如何用pyt.. 下一篇POJ - 1118 Lining Up

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: