YunYan

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

题目大意: 给出一个序列,然后求这个序列的最大上升子序列的和。

题解:定义状态dp[i]表示前i个数的最大和,dp[i]的最小值应该是arr[i]了,因为i前边可能有负数,对于负数,虽然可以构成上升子序列,但是没有必要选。

code:

#include<bits/stdc++.h>
using namespace std;
const long long  INF=1e18+7;
const int N=1e3+7;
long long  arr[N];
long long dp[N];
int main(){
    int n;
    while(cin>>n,n){ 
        for(int i=1;i<=n;i++){
            cin>>arr[i];
            dp[i]=arr[i];
        } 
        long long  ans=arr[1];
        for(int i=1;i<=n;i++){
            for(int j=1;j<i;j++){
                if(arr[i]>arr[j]){
                    dp[i]=max(dp[i],dp[j]+arr[i]);
                }
            }
            ans=max(ans,dp[i]);
        }
        cout<<ans<<endl;
    }
    return 0;
} 

 

posted on 2020-05-25 18:43  Target--fly  阅读(140)  评论(0编辑  收藏  举报