动态规划之最长公共不下降子序列(LIS)

最长公共不下降子序列(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;
}

猜你喜欢

转载自blog.csdn.net/weixin_44723496/article/details/109058058