hdoj1024【DP.最 大 m 字 段 和】(写完我都怕。。。不忍直视。。)
弱弱上路,看了好多题解。。。。【A的】
题意就是求最大m子段和。
我们先用a[1e6+7]存入数据;
定义:DP[ i , j ] 为前 j 个元素的 i 个子段的最大和,且第 i 个子段中包含了元素 a[j]。
我们先来看:DP[ i , j ]状态方程由来;
对于一个元素 a[ j ] :
① 他可以自成一段;
②也可以包含第 i 段上,而且是第 i 段上的末尾元素;
那么:
对于①:DP[ i , j ]=max(DP[ i - 1 ,t ])+a[ j ]; t∈( i - 1 , j );
我把元素a[ j ]自成一段,我们的目的是要达到DP[ i , j ]最大,那么就是要使前面的 i - 1 段最大,所以需要找一下最大,而且第 i - 1 段中的末尾元素肯定是区间(i - 1 , j)上;
对于②:DP[ i , j ]=DP[ i , j - 1 ] + a[ j ];
其实一开始,我是不理解为什么就是DP[ i , j - 1 ]啊,为什么不可以是DP[ i , j - 2 ],DP[ i , j - 3 ],然后再举例子就真是自己sb了(T . T),因为前提是子段,是连续的!!然后现在我们的条件是元素a[ j ]在第 i 段上了,而且是该段上的最后一个元素;
那么就好了啊,已经搞好了;
=> DP[i,j]=max(max(DP[ i - 1 , t ] ) ,DP[ i , j - 1 ] )+a[ j ];
但是这样写,会发现。。。哇艹,他的n是1e6啊!!!你给我开个二维数组那样代表?这样是不行的;
我们可以看到DP[ i , j ] 的值只和 DP[ i , j - 1 ] 和DP[ i - 1 , t ] 这两个值相关,
因此不需要二维数组,可以用滚动数组,只需要两个一维数组,
用now[ j ] 表示现阶段的最大值,即 DP[ i , j − 1] + a[ j ]
用pre[ j ] 表示上阶段的最大值,即 max{DP[ i − 1,t ] )+ a[ j ]
代码:
#include<iostream>
#include<cstdio>
#include<math.h>
#include<queue>
#include<map>
#include<stdlib.h>
#include<string>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long LL;
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
const int N=1e6+7;
int a[N];
int pre[N];
int now[N];
int Max_duan(int m,int n)
{
int i,j,max_sum;
memset(pre,0,sizeof(pre));
memset(now,0,sizeof(now));
for(i=1;i<=m;i++){
max_sum=INT_MIN;
for(j=i;j<=n;j++){
now[j]=max(pre[j-1],now[j-1])+a[j];
pre[j-1]=max_sum;
if(max_sum<now[j])
max_sum=now[j];
}
pre[j-1]=max_sum;
}
return max_sum;
}
int main()
{
int n,m;
while(~scanf("%d%d",&m,&n))
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
printf("%d\n",Max_duan(m,n));
}
return 0;
}
hdoj1024【DP.最 大 m 字 段 和】(写完我都怕。。。不忍直视。。)的更多相关文章
- DP问题大合集
引入 动态规划(Dynamic Programming,DP,动规),是求解决策过程最优化的过程.20世纪50年代初,美国数学家贝尔曼(R.Bellman)等人在研究多阶段决策过程的优化问题时,提出了 ...
- HDU 4640 状态压缩DP 未写完
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4640 解题思路: 首先用一个简单的2^n*n的dp可以求出一个人访问一个给定状态的最小花费,因为这i个 ...
- HDU 5087 (线性DP+次大LIS)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5087 题目大意:求次大LIS的长度.注意两个长度相同的LIS大小比较,下标和大的LIS较大. 解题思 ...
- CF628D Magic Numbers (数据大+数位dp)求[a,b]中,偶数位的数字都是d,其余为数字都不是d,且能被m整除的数的个数
题意:求[a,b]中,偶数位的数字都是d,其余为数字都不是d,且能被m整除的数的个数(这里的偶数位是的是从高位往低位数的偶数位).a,b<10^2000,m≤2000,0≤d≤9 a,b< ...
- ORACLE 检查数据库表中是否存在不规范字 段的语句参考.sql
--查看是否有除number,char,date,varchar2,clob/blob之外的类型,比如:NVARCHAR2,TIMESTAMP(6),FLOATSELECT DISTINCT a.DA ...
- [置顶] 北漂的大三IT男(暂完)
今天是2013年8月9日,是我待在北京的最后一个晚上,今天我已经正式向公司提出辞职了,虽然公司已经答应从下个月起涨部分工资,但是我还是坚决的离开了,回想当时进公司的想法----------干了一个月后 ...
- 【Nginx】如何封禁IP和IP段?看完这篇我会了!!
写在前面 Nginx不仅仅只是一款反向代理和负载均衡服务器,它还能提供很多强大的功能,例如:限流.缓存.黑白名单和灰度发布等等.在之前的文章中,我们已经介绍了Nginx提供的这些功能.小伙伴们可以到[ ...
- 十大面试难题解惑,看完秒杀一切 HR 面。程序员必读!
最能体现求职者能力的就是面试,能不能拿到Offer,取决于你面试时的表现,只有有准备才能在面试过程中游刃有余. 小编收集了10个面试官最爱提的问题,虽然题目千变万化,但是万变不离其宗,只要掌握了答题的 ...
- [数位DP]把枚举变成递推(未完)
动态规划(DP)是个很玄学的东西 数位DP实际上 就是把数字上的枚举变成按位的递推 有伪代码 for i =这一位起始值 i<=这一位终止值 dp[这一位][i]+=dp[这一位-1][i]+- ...
随机推荐
- Solidworks修改零件文件名之后工程图找不到零件怎么办
如下图所示,如果我直接把"压紧柱 V1.0"改名为"压紧柱",则打开工程图之后图纸都没了. 即便你用打开零件的方式找到了这个零件,工程图还是老样子 所以 ...
- 【剑指offer】打印1到最大的n位数
题目描写叙述: 输入数字n,按顺序打印出从1到最大的n位十进制数.比方输入3,则打印出1.2.3一直到最大的3位数即999. 分析描写叙述: 首先想到的是先计算出最大的n位数是多少,然后用一个循环从1 ...
- hdu3076ssworld VS DDD 概率dp
//ssworld VS DDD 两个人有血量值 hp1 , hp2 //两人掷骰子得到每一点的概率已知 //ssword赢的概率 //dp[i][j] 表示有第一个人血量为i.第二个人的血量为j ...
- MVC框架的优缺点
MVC框架的优缺点 解析:M(Model)-模型,V(View)-视图.C(Controller)-控制器 作用:M-处理应用程序数据部分,V-处理数据展示的部分.C-处理用户交互,逻辑功能实现 1. ...
- AVL树,红黑树,B-B+树,Trie树原理和应用
前言:本文章来源于我在知乎上回答的一个问题 AVL树,红黑树,B树,B+树,Trie树都分别应用在哪些现实场景中? 看完后您可能会了解到这些数据结构大致的原理及为什么用在这些场景,文章并不涉及具体操作 ...
- Cocos2d-x学习资源
1.CSDN博客:http://blog.csdn.net/legendof1991/article/category/2161091.主要讲的Cocos2d-x3.0 2.CSDN博客:http:/ ...
- openwrt network 初始化
openwrt 烧写完成之后, 第一次启动会设置 network 的相关参数, 如 ip地址, mac地址, 等. 这里跟踪一下启动之后直到网络参数设置的过程. /sbin/init -> pr ...
- Java Unit Testing - JUnit & TestNG
转自https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaUnitTesting.html yet another insignifican ...
- JavaScript重点记忆
String的常用方法 indexOf() 返回字符串中检索指定字符第一次出现的位置 lastIndexOf() 返回字符串中检索指定字符最后一次出现的位置 match() 找到一个或多个正则表达式的 ...
- luogu3384 【模板】 树链剖分
题目大意 已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作:操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z操作2: 格式: 2 x ...