最开始题目都读不懂,懂了以后不会做,应该还是没有深入思考,这道题是上升序列,不要求连续,然后算出最大上身序列的和,= =可能直接求出会比较麻烦,所以我们可以比较变计算,这样就使用到了动态规划了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[1005],dp[1005];
const int inf=9999999;
int max(int x,int y)
{
return x>y?x:y;
}
int main()
{
int n,sum;
while(cin>>n,n)
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
{
sum=-999;
for(int j=0;j<=i;j++)
{
if(a[i]>a[j])
sum=max(sum,dp[j]);
}
dp[i]=sum+a[i];
}
sum=-999;
for(int i=1;i<=n;i++)
{
if(sum<dp[i])
sum=dp[i];
}
cout<<sum<<endl;
}
return 0;
}