7-1 最大子列和问题
题目链接-7-1 最大子列和问题
输入样例:
6
-2 11 -4 13 -5 -2
输出样例:
20
解题思路
dp入门题
-
第一个数为一个有效序列
-
如果一个数加上上一个有效序列得到的结果比这个数大,那么该数也属于这个有效序列。
-
如果一个数加上上一个有效序列得到的结果比这个数小,那么这个数单独成为一个新的有效序列
-
状态转移方程为dp[i]=max(dp[i-1]+a[i],a[i]),边输入边取最大值ans
-
记得考虑题目中全是负数输出0的情况
做完这道题可以去看一下洛谷上的传送门——>P1115 最大子段和,跟这道题一模一样
附上代码
#include<bits/stdc++.h>
#define int long long
#define lowbit(x) (x &(-x))
using namespace std;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
const double eps=1e-10;
const int M=1e9+7;
const int N=1e5+5;
typedef long long ll;
typedef pair<int,int> PII;
int a[N],dp[N];
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int n,ans=-INF;
cin>>n;
bool flag=0;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]>=0)
flag=1;
dp[i]=max(dp[i-1]+a[i],a[i]);
ans=max(ans,dp[i]);
}
if(!flag){
cout<<0<<endl;
return 0;
}
cout<<ans<<endl;
return 0;
}