版权声明:关中大侠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;
}