数据结构与算法题目集(中文)7-1 最大子列和问题

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;
}
发布了78 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Fiveneves/article/details/104460216
今日推荐