题目链接:Max Sum Plus Plus Plus

题意:在n个数中取m段数使得这m段数之和最大,段与段之间不能重叠

分析:见代码

//dp[i][j]表示前i个数取了j段的最大值
//状态转移:dp[i][j]=max(dp[k][j-1]+(sum[k+l[j]-sum[k]或者sum[i]-sum[i-l[j]) (0<=k<=i-l[j])
// 这种做法是O(n^2)的
//如果改成O(n)的呢?
//需要加一个数组max_dp[i][j]表示前i个数取j段的dp最大值
//如果i>=l[j],dp[i][j]=max(dp[i][j],s[i-l[j]][j-1]+sum[i]-sum[i-l[j]]
//然后每次更新 max_len[i][j]=max(max_dp[i-1][j],dp[i][j])
//最后取dp[i][m]的最大值
//PS:说这道题是水题的人真的好好想过了吗?纵然你DP很厉害,也不能随便看看题目,发现是水题,然后抄了网上的代码,就完事了,
//真的有必要去多想想题目,百度出来的题解,一个抄一个,真的有意思?!!
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; int n,m,l[],sum[],dp[][],max_dp[][]; int main()
{
while(scanf("%d",&n),n)
{
scanf("%d",&m);
memset(dp,,sizeof(dp));
memset(max_dp,,sizeof(max_dp));
for(int i=;i<=m;++i) scanf("%d",l+i);
for(int i=;i<=n;++i)
{
scanf("%d",sum+i);sum[i]+=sum[i-];
}
/*
//O(n)
for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)for(int k=0;k<=i-l[j];k++)
dp[i][j]=max(dp[i][j],dp[k][j-1]+sum[k+l[j]]-sum[k]);
*/
//O(1)
for(int i=;i<=n;++i)for(int j=;j<=m;++j)
{
if(i>=l[j]) dp[i][j]=max(dp[i][j],max_dp[i-l[j]][j-]+sum[i]-sum[i-l[j]]);
max_dp[i][j]=max(max_dp[i-][j],dp[i][j]);
}
int ret=;
for(int i=;i<=n;++i) ret=max(ret,dp[i][m]);
printf("%d\n",ret);
}
}

HDU1244:Max Sum Plus Plus Plus的更多相关文章

  1. HDU 1024:Max Sum Plus Plus(DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=1024 Max Sum Plus Plus Problem Description Now I think you ...

  2. HDU3415:Max Sum of Max-K-sub-sequence(单调队列)

    Problem Description Given a circle sequence A[1],A[2],A[3]......A[n]. Circle sequence means the left ...

  3. HDU 1003:Max Sum(DP,连续子段和)

    Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  4. HDU 1024:Max Sum Plus Plus(DP,最大m子段和)

    Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  5. ACM1003:Max Sum

    Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum ...

  6. HDU-1003:Max Sum(优化)

    Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  7. HDU 1024:Max Sum Plus Plus 经典动态规划之最大M子段和

    Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  8. HDU 1003:Max Sum

    Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  9. LeetCode 363:Max Sum of Rectangle No Larger Than K

    题目链接 链接:https://leetcode.com/problems/max-sum-of-rectangle-no-larger-than-k/description/ 题解&代码 1 ...

随机推荐

  1. mysql 修改管理员密码

    mysql 修改管理员密码 本次学习环境: windows 7系统.mysql 5.7.14. 一.如果是忘记了用户密码: (1).关闭正在运行的MySQL服务. 方法一:可以直接操作wamp软件,左 ...

  2. IText 生成pdf,处理table cell列跨页缺失的问题

    /**     * 创建(table)PDF,处理cell 跨页处理     * @param savePath(需要保存的pdf路径)     * @param pmbs (数据库查询的数据)    ...

  3. django学习之- Cookie

    cookie:客户端游览器上的一个文件,以键值对进行保存,类似字典{'k':'sfs'},与服务器端没有关系,当游览器访问服务器时候,服务器会生成一个随机字符串保存在cookie中返回给客户端,这样当 ...

  4. Codeforces 549C The Game Of Parity【博弈】

    C语言纠错大赛的一道题,正好拿来补博弈~~ 给的代码写的略奇葩..不过还是直接在上面改了.. 题目链接: http://codeforces.com/problemset/problem/549/C ...

  5. c:forEach varStatus 属性

    c:forEach varStatus 属性 current: 当前这次迭代的(集合中的)项 index: 当前这次迭代从 0 开始的迭代索引 count: 当前这次迭代从 1 开始的迭代计数 fir ...

  6. HDU——1054 Strategic Game

    Strategic Game Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  7. Topcoder 2015_1C

    A:大水题; B:求一颗树中,有多少条路径 不存在路径中一点是另外一点的祖先,(后面废话说了很多) 其实一个点 可以到它本身也可以是一条路径结论是:统计叶子的节点.(真简单粗暴 C:题目不说,说也说不 ...

  8. Linux 将一般的用户加入sudo组is_not_in_the_sudoers_file._This_incident_will_be_reported解决方法

      在一般用户下执行sudo命令提示xxx is not in the sudoers file. This incident will be reported.解决方法:        $where ...

  9. 使用正則表達式的格式化与高亮显示json字符串

    使用正則表達式的格式化与高亮显示json字符串 json字符串非常实用,有时候一些后台接口返回的信息是字符串格式的,可读性非常差,这个时候要是有个能够格式化并高亮显示json串的方法那就好多了,以下看 ...

  10. 设计模式C++实现_2_简单工厂模式

    简单工厂模式 主要用于创建对象. 新加入类时. 不会影响曾经的系统代码. 核心思想是用一个工厂来依据输入的条件产生不同的类,然后依据不同类的 virtual 函数得到不同的结果. 以下以苹果手机的生产 ...