【模板】 最大最长上升子序列和
传送门
题意
给定一个长度为 \(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;
}