【DP】最长上升子序列

Description

设有由n(1≤n≤200)个不相同的整数组成的数列,记为:b(1)、b(2)、……、b(n)且b(i)≠b(j)(i≠j),若存在i_1<i_2<i_3<…<i_ei1​

例如13,7,9,16,38,24,37,18,44,19,21,22,63,15。例中13,16,18,19,21,22,63就是一个长度为7的上升序列,同时也有7 ,9,16,18,19,21,22,63组成的长度为8的上升序列。

Input

第一行为n,第二行为用空格隔开的n个整数

Output

一行输出最长上升子序列的长度

Sample Input 1 

14
13 7 9 16 38 24 37 18 44 19 21 22 63 15

Sample Output 1

8

题解

这道题其实非常简单,只需要把状态转移方程找到,就可以非常愉快地dp跑一遍解决。

状态转移方程:dp[ i ] = max (dp[ i ], dp[ j ] + 1);

边界:dp[ i ] = 1;

AC代码

#include
using namespace std;
int n;
int ans = 1; 
int a[247];
int dp[217];
int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	for (int i = 1; i <= n; i++) {
		dp[i] = 1;
		for (int j = 1; j < i; j++) {
			if (a[i] > a[j]) {
				dp[i] = max(dp[i], dp[j] + 1); // 从起始位置到i位置的最长上升子序列 
			}
		}
		ans = max(ans, dp[i]);
	}
	cout << ans;
	return 0;
}

 

你可能感兴趣的:(DP,DP)