传送门
题意
给定一个长度为(n)的序列(a),求出(a)中和最大的上升子序列值
数据范围
(1leq nleq 1000)
题解
- (dp[i])表示(1sim 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;
}