hdu1003 dp(最大子段和)
题意:给出一列数,求其中的最大子段和以及该子段的开头和结尾位置。
因为刚学过DP没几天,所以还会这题,我开了一个 dp[100002][2],其中 dp[i][0] 记录以 i 为结尾的最大子段的和, dp[i][1] 记录以第 i 个数 A[i] 为结尾的和最大子段的开始位置。
对于每一个数 A[i] :
我考察它的前一个数 A[i-1] ,若以 A[i-1] 为结尾的最大子段和 dp[i-1][0] 大于等于 0 ,那么在这个基础上加上 A[i] ,一定大于等于 A[i] 本身,所以以第 i 个数结尾的最大子段就是以第 i-1 个数结尾的最大子段加上第 i 个数,以此更新 dp[i] ;
而若 dp[i-1][0] 小于 0 ,那么在这个子段的基础上加上 A[i] ,一定小于 A[i] 本身,所以以第 i 个数为结尾的和最大子段就是这个数本身,所以 dp[i] 也就可以这样得到了。
当遍历一遍数列之后,再求最大的 dp[i][0] ,输出 dp[i][0] 、 dp[i][1] 和 i 即可。
#include<stdio.h>
int A[];
long long dp[][];
int main(){
int T;
while(scanf("%d",&T)!=EOF){
long long N,q;
for(q=;q<=T;q++){
scanf("%I64d",&N);
long long i,ans,stx,edx=;
for(i=;i<=N;i++)scanf("%d",&A[i]);
printf("Case %I64d:\n",q);
ans=dp[][]=A[];
stx=dp[][]=;
for(i=;i<=N;i++){
if(dp[i-][]>=){
dp[i][]=dp[i-][]+A[i];
dp[i][]=dp[i-][];
}
else{
dp[i][]=A[i];
dp[i][]=i;
}
}
for(i=;i<=N;i++){
if(dp[i][]>ans){
ans=dp[i][];
stx=dp[i][];
edx=i;
}
}
printf("%I64d %I64d %I64d\n",ans,stx,edx);
if(q!=T)printf("\n");
}
}
return ;
}
hdu1003 dp(最大子段和)的更多相关文章
- 一类适合初学者的DP:最大子段和与最大子矩阵
最近在水简单DP题,遇到了两道层层递进的DP题,于是记录一下 一.最大子段和 题意: 给出一个长度为n(n<=1e5)的序列,求连续子段的最大值 比如说2 3 -4 5 的最大值是6 而 2 ...
- 51nod 1050 循环数组最大子段和【环形DP/最大子段和/正难则反】
1050 循环数组最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 N个整数组成的循环序列a[1],a[2],a[3],…,a[n],求该 ...
- POJ2479 Maximum sum[DP|最大子段和]
Maximum sum Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 39599 Accepted: 12370 Des ...
- NOIP2013pj小朋友的数字[DP 最大子段和]
描述 有 n 个小朋友排成一列.每个小朋友手上都有一个数字,这个数字可正可负.规定每个小朋友的特征值等于排在他前面(包括他本人)的小朋友中连续若干个(最少有一个)小朋友手上的数字之和的最大值.作为这些 ...
- hdu1003 dp
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1003 #include<cstdio> #include<algorit ...
- hdu 5586 Sum【dp最大子段和】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5586 Sum Time Limit: 2000/1000 MS (Java/Others) Me ...
- 51nod DP 最大子段和
#include<iostream> #include<algorithm> #include<cstdio> #define MAXN 50000 using n ...
- HDU1003 dp 动态规划解析
Input The first line of the input contains an integer T(1<=T<=20) which means the number of te ...
- (线性dp 最大子段和 最大子矩阵和)POJ1050 To the Max
To the Max Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 54338 Accepted: 28752 Desc ...
随机推荐
- matlab和C/C++混合编程--Mex (六)参数传递
最近的项目需要matlab和C的混合编程,经过一番努力终于完成了项目要解决的问题.现在就将Mex的一些经验总结一下,当然只是刚刚开始,以后随着学习的深入继续添加.首先讲讲写Mex的一些常规规定,然后我 ...
- 苹果推送APNS自己总结
开发状态服务器地址 gateway.sandbox.push.apple.com 2195 产品状态服务器地址 gateway.push.apple.com 2195 Developm ...
- julia下载QQ.jl
julia下载QQ.jl #=""" julia下载QQ.jl 从http://im.qq.com/pcqq/页面中提取出QQ的下载地址,并下载. 2016年4月1日 1 ...
- ImageLoder配置以及使用(个人阅读使用)
http://blog.csdn.net/vipzjyno1/article/details/23206387 在gradle添加: compile 'com.nostra13.universalim ...
- php访问数据库思维导图
- 理解smart pointer之三:unique_ptr
unique_ptr最先在boost中被定义,后来被C++标准委员会选中为C++11的feature之一. std::unique_ptr is a smart pointer that retain ...
- oracle 之关键字exists
-----------------------------------------------------------------------SQL中EXISTS的用法---------------- ...
- jsp弹出Please check the location and try again!对话框
关闭它的jsp图形模式.myeclipse10中打开jsp文件时,右键open with 选MyEclipse JSP Editor,不选MyEclipse Visual JSP Editor模式.
- 8、SQL基础整理(约束)
约束 主键约束 防止在新增数据时出错,有约束性,起唯一标志的作用,在新增条目的时候防止不慎添加重复内容(不允许有null值) 1. 右键—设计—设置主键 2.在创建表格时设置 code int pr ...
- mysql实现高效率随机取数据
从数据库中(mysql)随机获取几条数据很简单,但是如果一个表的数据基数很大,比如一千万,从一千万中随机产生10条数据,那就相当慢了,如果同时一百个人访问网站,处理这些个进程,对于一般的服务器来说,肯 ...