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 ...
随机推荐
- SQL SERVER 2012 第四章 连接 JOIN の INNER JOIN
所有JOIN语句的共同点是:将一个记录与另外一个或多个记录匹配,从而生成一个新记录,这个记录是由两个记录的合并列所产生的一个超集. 内部连接: 内部连接语法结构:SELECT <select l ...
- zookeeper客户端
查看具体结点信息 bash zkServer.sh status 查看哪个结点被选作leader或者followerecho stat|nc 127.0.0.1 2181 测试是否启动了该Server ...
- SharePoint 2013 调查问卷的使用方法
SharePoint 2013 调查问卷的使用方法 1,介绍调查问卷的用法. 2.图形和全部结果. 3,控制用户仅仅能看到自己答案. 1.确认有权限,假设没有管理管理权限请向管理员申请. 站点&quo ...
- C语言必会面试题(3、耶稣有13个门徒,当中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:13人围坐一圈,从第一个開始报号:1,2,3,1,2,3...。凡是报到“3”就退出圈子,...)
3.耶稣有13个门徒.当中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:13人围坐一圈,从第一个開始报号:1.2,3.1,2,3.... 凡是报到"3"就退出圈子.最后留在圈子 ...
- libevent HTTP client 的实现
my_conn_ = evhttp_connection_base_new(ev_base_,ev_dns_,host,port); struct evhttp_request *http_req; ...
- hdu1873 看病要排队(结构体优先队列)
看病要排队 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- window.location.hashs属性介绍
长话短说. location是javascript里边管理地址栏的内置对象.比方location.href就管理页面的url,用location.href=url就能够直接将页面重定向url. 而lo ...
- JNI返回复杂对象之中的一个
需求: 首先说需求.近期接手一个项目.要在底层解析二进制数据,数据结构比較负责,因为server是c++server,加之開始没有考虑到移动端开发,所以协议有点扯蛋.大体是这种,一个数据包里面是map ...
- 【iOS系列】-autorelease的作用
内存管理原则(配对原则):只要出现了new,alloc,retain方法,就要配对出现release,autorelease 1:对象存入到自动释放池中,当这个池子被销毁的时候他会对池子中所有的对 ...
- 百度AI的语音合成,语音识别
1,语音的合成,识别 后端代码: from aip import AipSpeech, AipNlp import os # 语音合成 """ 你的 APPID AK S ...