题目:
2 5 6 -1 5 4 -7 7 0 6 -1 1 -6 7 -5
Case 1: 14 1 4 Case 2: 7 1 6
题意:给你一个序列,然后求连续的一段数相加最大,求出这个最长子序列。。
想法:第一个用动态规划的题,用搜索应该也能做,但时间长,假定Max(k)表示以ak 做为“终点”的最长上升子序列的长度,那么:Max(1) = 1,Max (k) = Max { Max (i):1<i < k 且 ai < ak 且 k≠1 } + 1。。然后累加值即可。。
代码:
#include <iostream>
#include<stdio.h>
using namespace std;
int main()
{
//freopen("r.txt","r",stdin);
int i,ca=1,t,s,e,n,x,now,before,max;
cin>>t;
while(t--)
{
cin>>n;
for(i=1;i<=n;i++)
{
cin>>now;
if(i==1)
{
max=before=now;
x=s=e=1;
}
else {
if(now>now+before)
{
before=now;
x=i;
}
else before+=now;
}
if(before>max)
max=before,s=x,e=i;
}
cout<<"Case "<<ca<<":"<<endl;
cout<<max<<" "<<s<<" "<<e<<endl;
ca++;
if(t!=0)
cout<<endl;
}
return 0;
}
搜索比较容易想,代码比较长。。动态规划却相反。。