最大连续子序列和——动态规划

版权声明:关中大侠Lv轻侯 https://blog.csdn.net/weixin_44312186/article/details/88785561

题目概述:给定一个数字序列A1,A2,...,An,求i,j(1≤i≤j≤n),使得Ai+,...,+Aj最大,输出这个最大和。

样例:

-2 11 -4 13 -5 -2

显然11+(-4)+3=20为和最大的选值情况,因此最大和为20

 思路:

代码:

#include<bits/stdc++.h>
#define maxn 1000
using namespace std;
int dp[maxn];

int main()
{	
	int  n;
	scanf("%d",&n);
	int a[maxn]; 
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	dp[0]=a[0];//边界 (结果总是确定的,动态规划总是从这些边界出发)
	for(int i=0;i<n;i++){   
		dp[i]=max(a[i],dp[i-1]+a[i]);//递推式 
	}
	int k=0;
	for(int i=0;i<n;i++){//dp[i]存放以a[i]结尾的连续序列的最大和,需要遍历i得到最大的才是结果 
		if(dp[i]>dp[k]){
			k=i;
		}
	}
	printf("%d\n",dp[k]);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44312186/article/details/88785561