动态规划问题
题目的大体意思就是给你一个长度为N的数组,然后求两个不相交的子序列的相加的最大和
刚开始我没有想到分别从前后求子序列的和,并且保存最大值,后来看了别人的解题报告,忽然懂得了
先从i=0开始求从0到N-1的子序列的和,保存最大值,然后从N-1开始求右边最大子序列的和
然后设一个变量用来保存两个子序列和,输出最大值。
自己写代码的时候有一点被自己坑到了,直接从N-1到0,其实到1就可以了
输入
5 -5 9 -5 11 20 0输出
40
#include<stdio.h>
const int max=100010;
int main()
{
int n,a[max],maxl[max];
while(scanf("%d",&n)&&(n!=0))
{
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
int MAX=-9999999;
int maxsuml=0;
for(int i=0;i<n;i++)
{
maxsuml+=a[i];
if(maxsuml>MAX)
MAX=maxsuml;
if(maxsuml<0)
maxsuml=0;
maxl[i]=MAX;
}
MAX=-9999999;
int maxsumr=0,temp=-9999999;
for(int i=n-1;i>=1;i--)
{
maxsumr+=a[i];
if(maxsumr>MAX)
MAX=maxsumr;
if(maxsumr<0)
maxsumr=0;
if(temp<MAX+maxl[i-1])//若i循环到0,数组就下标越界了
temp=MAX+maxl[i-1];
}
printf("%d\n",temp);
}
return 0;
}