最大子段和 经典dp
2017-08-10 21:50
357 查看
N个整数组成的序列a11,a22,a33,…,ann, 求该序列如aii+ai+1i+1+…+ajj的连续子段和的最大值。当所给的整数均为负数时和为0。
例如:-2,11,-4,13,-5,-2,和最大的子段为:11,-4,13。和为20。
Input
第1行:整数序列的长度N(2 <= N <= 50000)
第2 - N + 1行:N个整数(-10^9 <= Aii <= 10^9)
Output
输出最大子段和。
Sample Input
6
-2
11
-4
13
-5
-2
Sample Output
20
思路:经典dp, dp[i]表示以Ai为结尾的连续子序列的最大和
AC代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<string>
#include<stack>
#include<cstdlib>
typedef long long ll;
using namespace std;
ll a[50050],dp[55000];
ll max(ll a,ll b){ //此处不用写,只是当时不知道在0ll就是long long了。max是模板函数不用手写
return a>b?a:b;
}
int main()
{
int n,flag=0;
ll ans=0,sum=0;
cin>>n;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]); //注意数据范围
if(a[i]>=0)flag=1;
}
if(!flag){ //记录是否都是负数
printf("0\n");
return 0;
}
else{
for(int i=1;i<=n;i++){
sum=max(sum,0)+a[i];
ans=max(ans,sum);
/*此段也可写成:
if(dp[i-1]>0)
dp[i]=dp[i-1]+a[i];
else
dp[i]=a[i];
ans=max(ans,dp[i]);*/
}
printf("%I64d\n",ans);
}
return 0;
}
例如:-2,11,-4,13,-5,-2,和最大的子段为:11,-4,13。和为20。
Input
第1行:整数序列的长度N(2 <= N <= 50000)
第2 - N + 1行:N个整数(-10^9 <= Aii <= 10^9)
Output
输出最大子段和。
Sample Input
6
-2
11
-4
13
-5
-2
Sample Output
20
思路:经典dp, dp[i]表示以Ai为结尾的连续子序列的最大和
AC代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<string>
#include<stack>
#include<cstdlib>
typedef long long ll;
using namespace std;
ll a[50050],dp[55000];
ll max(ll a,ll b){ //此处不用写,只是当时不知道在0ll就是long long了。max是模板函数不用手写
return a>b?a:b;
}
int main()
{
int n,flag=0;
ll ans=0,sum=0;
cin>>n;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]); //注意数据范围
if(a[i]>=0)flag=1;
}
if(!flag){ //记录是否都是负数
printf("0\n");
return 0;
}
else{
for(int i=1;i<=n;i++){
sum=max(sum,0)+a[i];
ans=max(ans,sum);
/*此段也可写成:
if(dp[i-1]>0)
dp[i]=dp[i-1]+a[i];
else
dp[i]=a[i];
ans=max(ans,dp[i]);*/
}
printf("%I64d\n",ans);
}
return 0;
}
相关文章推荐
- 51nod 1053 最大M子段和 V2 (链表 对经典dp进行优化)
- Max Sum Plus Plus 最大子段和 经典 Dp
- 4000 最大子段和问题(dp大法)
- 51Nod1053 最大M子段和V2 二分+DP
- POJ 2955 Brackets --最大括号匹配,区间DP经典题
- HAUT 1266 最大子段和(类似DP)(河南工业大学2017校赛)
- 最大子段和部分问题(DP)
- 51nod 1049 1049 最大子段和 (dp)
- Codeforces 75D Big Maximum Sum 最大子段和 dp
- HDU 1003 Max Sum(最大连续子序列和 经典DP)
- (DP)最大子段和问题分析和总结(…
- 51nod 1049 1050 1051 (循环数组)最大子段(子矩阵)和(dp)
- HAUT 1266 最大子段和(类似DP)(河南工业大学2017校赛)
- FZU 2253 DP(最大子段和变形)
- 51nod oj 1050 循环数组最大子段和 【DP】
- HAUT 1266 最大子段和(类似DP)(河南工业大学2017校赛)
- HDOJ 1003 经典DP--求最大字串和
- 最大子段和 (含变形)【dp】
- POJ 1050 To the Max(dp 最大子矩阵和/最大子段和问题)
- 【dp专题1】hdu1003 D - Max Sum 【最大子段和模板题】