51nod 1052 最大M子段和
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1052
题意:

思路:
设$dp[i][j]$表示前j个数构成i个字段时的最大值,并且必须以j结尾。
那么状态转移方程就是:
①$dp[i][j]=max(dp[i][j],dp[i][j-1]+a[j])$,此时是将j接在第i个字段的末尾,字段数不增加。
②$dp[i][j]=max(dp[i][j],dp[i-1][t],+a[j])$ $(i-1<=t<j)$,此时是让j单独成为一个字段的段首。
对于第二种情况的话,每次去枚举t的话会比较耗时,其实我们只需要记录好上一行的状态,然后每次取最大值即可,也就是用滚动数组来实现。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int INF = 0x3f3f3f3f;
const int maxn=+; int n, m;
int a[maxn];
ll dp[maxn][]; int main()
{
//freopen("in.txt","r",stdin);
while(~scanf("%d%d",&n,&m))
{
ll sum=;
int cnt=;
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]>) {cnt++;sum+=a[i];}
}
int cur=;
if(m>=cnt) printf("%lld\n",sum);
else
{ for(int i=;i<=m;i++)
{
cur^=;
dp[i][cur]=dp[i][cur^]+a[i]; //先赋初值,将前面的i个数每个数都分成1段
ll MAX=dp[i-][cur^]; //取上一行前i-1个数的最大值
for(int j=i;j<=n-m+i;j++)
{
dp[j][cur]=max(dp[j-][cur],MAX)+a[j]; //状态转移方程的选择
if(MAX<dp[j][cur^]) MAX=dp[j][cur^]; //动态维护上一行前j个的最大值
}
}
ll ans=;
for(int i=;i<=n;i++) ans=max(ans,dp[i][cur]);
printf("%lld\n",ans);
} }
return ;
}
51nod 1052 最大M子段和的更多相关文章
- 51nod 1065 最小正子段和
题目链接:51nod 1065 最小正子段和 房教说用前缀和做,然后看了别人博客懂了后就感觉,这个真有意思... #include<cstdio> #include<cstring& ...
- 1052 最大M子段和(DP)
1052 最大M子段和 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 N个整数组成的序列a[1],a[2],a[3],…,a[n],将这N个数划分为互不相交的M个 ...
- 51nod 循环数组最大子段和
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1050 对于普通的数组,只要求一次最大子段和即可.但是这题是可以循环的,所 ...
- 51nod 1049 1049 最大子段和 (dp)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1049 令 dp[i]表示为以a[i]结尾的最大子段和,则 dp[i]= ...
- 51Nod 1049:最大子段和(dp)
1049 最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 N个整数组成的序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+ ...
- 51nod 1052 (dp)
最大M子段和 N个整数组成的序列a[1],a[2],a[3],…,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的.如果M >= N个数中正数的个数,那么输出所有正数的和 ...
- 51nod 循环数组最大子段和(动态规划)
循环数组最大子段和 输入 第1行:整数序列的长度N(2 <= N <= 50000) 第2 - N+1行:N个整数 (-10^9 <= S[i] <= 10^9) 输出 输 ...
- 51nod 1115 最大M子段和 V3
环形最大M子段和,N个整数组成的序列排成一个环,a[1],a[2],a[3],…,a[n](a[n-1], a[n], a[1]也可以算作1段),将这N个数划分为互不相交的M个子段,并且这M个子段的和 ...
- 51nod 1053 最大M子段和 V2
N个整数组成的序列a[1],a[2],a[3],…,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的.如果M >= N个数中正数的个数,那么输出所有正数的和. 例如:-2 ...
随机推荐
- Hive批量删除历史分区
批量删除历史分区和数据可以采用如下操作: -- 删除20180101之前的所有分区 alter table example_table_name drop if exists partition (d ...
- vue对比其他框架详细介绍
vue对比其他框架详细介绍 对比其他框架 — Vue.jshttps://cn.vuejs.org/v2/guide/comparison.html React React 和 Vue 有许多相似之处 ...
- 新服务器上装java PHP环境有什么一键安装的方便的方法?一般都是怎么安装环境的?
新服务器上装java PHP环境有什么一键安装的方便的方法?一般都是怎么安装环境的? linode digitalocean都有很好的教程,下面是ubuntu和centos的两个教程连接. How ...
- 1069: 统计字符gets函数
题目描述 编制程序,统计文本stdin中字符$出现的次数,并将结果写入文件stdout 输入 字符文本 输出 $次数 样例输入 as$dfkjhkjkjdhf asdfkj$lskdfj werijw ...
- Selenium 常用定位对象元素的方法
常见定位对象元素的方法 在使用selenium webdriver进行元素定位时,通常使用findElement或findElements方法结合By类返回的元素句柄来定位元素.其中By类的常用定位方 ...
- Python+OpenCV图像处理(八)—— 图像直方图
直方图简介:图像的直方图是用来表现图像中亮度分布的直方图,给出的是图像中某个亮度或者某个范围亮度下共有几个像素.还不明白?就是统计一幅图某个亮度像素数量.比如对于灰度值12,一幅图里面有2000 个像 ...
- P1258 小车问题
P1258 小车问题 蒟蒻精神自强不息蒟蒻精神永不言败加油加油ヾ(◍°∇°◍)ノ゙yeah yeah yeah 据说这是道小学奥数题抱歉蒟蒻的我没学过奥数,算了大概三大张演草纸,不得不说这题对于蒟蒻本 ...
- jmeter压力测试及抓包
如何使用jmeter进行分布式压力测试? 1.其他的压力机启动jmeter-server 2.在主控机jmeter的配置文件jmeter.properties里面找到,remote_hosts=xx, ...
- css实现16:9的图片比例
摘自:https://www.cnblogs.com/caizhenbo/p/css.html 需求: 最近产品要求不管原图的大小是多少,宽度一定,高度要自自适应为16:9. 分析: 对于正常的固定好 ...
- Baidu WebFE(FEX)团队开发 的 文件上传插件 WebUploader
1.webUploader官网下载地址:http://fex.baidu.com/webuploader/ 直接下载代码,运行examples目录文件即可 2.webUploader上传demo:ht ...