[ACM] n划分数m部分,它要求每一个部分,并采取了最大的产品(间隔DP)

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<j;k++)
        {
            dp[j][i]=max(dp[j][i],dp[k][i-1]*(sum[j]-sum[k]));
        }

代码:

#include <iostream>
#include <algorithm>
#include <string.h>
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<j;k++)
        {
            dp[j][i]=max(dp[j][i],dp[k][i-1]*(sum[j]-sum[k]));
        }
        cout<<dp[n][m]<<endl;
    }
    return 0;
}

一開始写的一维的,但是一直WA,不知道为什么。求解。

错误的一维代码:

#include <iostream>
#include <string.h>
#include <algorithm>
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<j;k++)
                {
                    dp[j]=max(dp[j],dp[k]*(sum[j]-sum[k]));
                }
            }
        }
        cout<<dp[n]<<endl;
    }
    return 0;
}

版权声明:本文博客原创文章。博客,未经同意,不得转载。

时间: 2024-10-23 02:23:26

[ACM] n划分数m部分,它要求每一个部分,并采取了最大的产品(间隔DP)的相关文章

[ACM] n个数分为m部分,要求每部分的和乘起来积最大(区间DP)

A - 爱管闲事 春希非常爱管闲事,他每天都会抽空帮助一些同学,由于春希非常死板,出于公平性,春希不会先帮助后来找他的同学. 现在有n个同学需要他的帮助,虽然他很想一天之类帮助所有人,但毕竟精力有限,于是他决定分m天来帮助他们. 根据事情的重要性,春希帮助不同同学会有不同的快乐值,而春希获得的总的快乐值为每天获得的快乐值的乘积. 现在给出n和m,以及帮助完各同学时获得的快乐值,求春希能获得的最大快乐值. Input 第一行为一个整数T,代表数据组数. 每组数据,第一行两个整数n,m.表示需要帮助

acm常见算法及例题

转自:http://blog.csdn.net/hengjie2009/article/details/7540135 acm常见算法及例题 初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法

2016 ACM/ICPC Asia Regional Shenyang Online 1007/HDU 5898 数位dp

odd-even number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 388    Accepted Submission(s): 212 Problem Description For a number,if the length of continuous odd digits is even and the length

ACM - a + b Problem

前几天看了ACM的第一题,映入眼帘的是一个“简单”的题目: 输入两个数,a,b 输出他们的和. 本着,此乃ACM的原则,便有了如下的思考: ACM的题目肯定很难,a+b,怎么可能直接printf,不行,应该不是这么简单. 是否可以利用字符串的方式进行解答,思路我都想好了. 思路如下: ================================================================= 1.用字符串来获取输入的数字. 2.两个字符串相加,将其限定在0-9表示的范围内.

Sdut 2108 Alice and Bob(数学题)(山东省ACM第四届省赛D题)

题目地址:sdut 2608 Alice and Bob Alice and Bob Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Alice and Bob like playing games very much.Today, they introduce a new game. There is a polynomial like this: (a0*x^(2^0)+1) * (a1 * x^(2^1)+1)*....

转 acm历程 置顶帖

作者情况和我差不多 期望可以激励自己 转 http://blog.csdn.net/yueqiq/article/details/7623176 首先,我想说的就是,我是一个很普通的ACMer,高中没有参加过任何计算机和数学竞赛的经历,也没有ben那样过人的天资,努力至今也未能取得什么成绩,我之所以写下这篇文章,只是希望给刚进大学或者刚进ACM队的同学一点小小的帮助,希望你们可以少走一些弯路,更希望你们可以帮助华理取得我没能取得的辉煌. (1).起步阶段我是从大二开始接触ACM的,要说基础的话就

2016 ACM/ICPC Asia Regional Shenyang Online 1003/HDU 5894 数学/组合数/逆元

hannnnah_j’s Biological Test Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 802    Accepted Submission(s): 269 Problem Description hannnnah_j is a teacher in WL High school who teaches biolog

从ACM会议分析我国计算机科学近十年发展情况

从ACM会议分析我国计算机科学近十年发展情况 来源:<中国计算机学会通讯>2015年第10期<专栏> 作者:陈 钢 2006年,承蒙李国杰院士推荐,<中国计算机学会通讯>发表了我的一篇文章“从ACM会议论文数量看差距”.该文就中国大陆学者在ACM会议上论文发表情况,将中国计算机科学同国际水平进行了比较和分析.得出的结论是,从论文发表角度看,当时中国的计算机科学同国外的差距非常大,尤其是在顶级会议上,中国的论文凤毛麟角,在不少重要会议上甚至是0.近十年来,中国计算机学术界

ACM训练方案-POJ题目分类

ACM训练方案-POJ题目分类 博客分类: 算法 ACM online Judge 中国: 浙江大学(ZJU):http://acm.zju.edu.cn/ 北京大学(PKU):http://acm.pku.edu.cn/JudgeOnline/ 杭州电子科技大学(HDU):http://acm.hdu.edu.cn/ 中国科技大学(USTC):http://acm.ustc.edu.cn/ 北京航天航空大学(BUAA)http://acm.buaa.edu.cn/oj/index.php 南京