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

题目概述:

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

样例:

-2 11 -4 13 -5 -2

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

 思路:

1、因为dp[i]要求是必须以A[i]结尾的连续序列,那么只有两种情况:

①这个最大和的连续序列只有一个元素,即以a[i]开始,以A[i]结尾。

②这个最大和的连续序列有多个元素,即从前面的某处a[p](p<i),一直到a[i]结尾。

2、对于①,最大和就是本身a[i];

对于②,最大和是dp[i-1]+a[i],即a[p]+...+a[i-1]+a[i]=dp[i-1]+a[i];

对于这两种情况可以得到状态转移方程dp[i]=max{a[i],dp[i-1]+a[i]} ,这个式子只和i以及i之前的元素有关,且边界为dp[0]=a[0]。

参考代码:

#include
#define maxn 1000
using namespace std;
int dp[maxn];

int main()
{	
	int  n;
	scanf("%d",&n);
	int a[maxn]; 
	for(int i=0;idp[k]){
			k=i;
		}
	}
	printf("%d\n",dp[k]);
	return 0;
}

 

你可能感兴趣的:(算法刷题笔记)