【模板】 最大最长上升子序列和

传送门

题意

给定一个长度为 \(n\) 的序列 \(a\),求出 \(a\) 中和最大的上升子序列值

数据范围

\(1\leq n\leq 1000\)

题解

  • \(dp[i]\) 表示 \(1\sim i\) 中的最大上升子序列和
  • 状态转移:当 \(a[i]>a[j]\) 时,\(dp[i] = max(dp[i] , dp[i] + a[j] )\)
  • 最后答案等于所有终点中的最大上升子序列和中的最大值

Code

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,n,a) for(int i=n;i>=a;i--)
#define close ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define ll long long

int a[1010],dp[1010];
int n;
int main(){
    close
    cin>>n;
    rep(i,0,n-1) cin>>a[i];

    rep(i,0,n-1){
        dp[i]=a[i];
        rep(j,0,i-1)
            if(a[i]>a[j])
                dp[i]=max(dp[i],dp[j]+a[i]);
    }
    int ans=-1e9;
    rep(i,0,n-1)
        ans=max(ans,dp[i]);
    cout<<ans<<endl;
}

posted @ 2020-11-07 21:27  Hyx'  阅读(99)  评论(0编辑  收藏  举报