HDU1244: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的更多相关文章
- 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 ...
- 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 ...
- HDU 1003:Max Sum(DP,连续子段和)
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- 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 ...
- ACM1003:Max Sum
Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum ...
- HDU-1003:Max Sum(优化)
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- 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 ...
- HDU 1003:Max Sum
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- LeetCode 363:Max Sum of Rectangle No Larger Than K
题目链接 链接:https://leetcode.com/problems/max-sum-of-rectangle-no-larger-than-k/description/ 题解&代码 1 ...
随机推荐
- Eddy's AC难题--hdu2200(递推)
Problem Description Eddy是个ACMer,他不仅喜欢做ACM题,而且对于Ranklist中每个人的ac数量也有一定的研究,他在无聊时经常在纸上把Ranklist上每个人的ac题目 ...
- CTEX - 在线文档 - TeX/LaTeX 常用宏包
CTEX - 在线文档 - TeX/LaTeX 常用宏包 页面与章节标题式样 浮动对象及标题设计 生成与插入图形 表格与列表 目录与索引 参考文献 数学与化学公式 ...
- Office2010,PPT,EXCEL如何插入日历控件
1 在Office2010中插入其他控件,然后找到日历控件 2 十字架随便在Excel中绘制一下,得到一个日历控件,注意此时还是在设计模式下,在设计模式下日历控件不是正常状态,你还是可以双击这个控 ...
- Hadoop之中的一个:Hadoop的安装部署
说到Hadoop不得不说云计算了,我这里大概说说云计算的概念,事实上百度百科里都有,我仅仅是copy过来,好让我的这篇hadoop博客内容不显得那么单调.骨感.云计算近期今年炒的特别火,我也是个刚開始 ...
- 他人第三方库在linux上的安装
1.下载tar.gz等压缩包 2.解压 3.安装 4.确保路径
- iOS开发——高级篇——线程保活
线程保活: 顾名思义,就是保护线程不死(保证线程处于激活状态,生命周期没有结束) 正常情况,当线程执行完一次任务之后,需要进行资源回收,也就意味着生命周期结束 应用场景: 当有一个任务,随时都有可能去 ...
- BZOJ1087=Codevs2451=洛谷P1896&P2326互不侵犯
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2885 Solved: 1693[Submit][ ...
- Codevs 2006=BZOJ 2964 Boss单挑战
2964: Boss单挑战 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 266 Solved: 120[Submit][Status][Discu ...
- C从控制台(stdin)输入带空格的字符串到字符数组中
用scanf("%s",array); 的话遇到空格就停止接收后面的字符了,那怎么才能接收带空格的字符串呢? 1.用 gets() ,它可以接收带空格的字符串, 直到回车才结束输入 ...
- Strus2中关于ValueStack详解
什么是ValueStack 它是一个接口com.opensymphony.xwork2.util.ValueStack.我们使用它是将其做为一个容器,用于携带action数据到页面.在页面上通过ogn ...