最长公共不下降子序列(LIS)
问题描述
在一个数字数列中,找到一个最长的子序列(可以不连续),使得这个子序列是不下降(非递减)的。
样例输入
7
1 2 3 -1 -2 7 9
样例输出
5
动态转移方程:dp[i] = max{1, dp[j] + 1}
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
int s[n];
for(int i = 0; i < n; i++){
cin>>s[i];
}
int dp[n];
memset(dp, 0, sizeof(dp));
int ans = -1; //记录结果
for(int i = 0; i < n; i++){
dp[i] = 1;
for(int j = 0; j < i; j++){
if(s[i] >= s[j] && dp[j] + 1 > dp[i]){
dp[i] = dp[j] + 1; //动态转移方程
}
}
ans = max(ans, dp[i]);
}
cout<<ans;
return 0;
}