DP LIS

最长上升子序列

题目描述

这是一个简单的动规板子题。

给出一个由 n ( n ≤ 5000 ) n(n\le 5000) n(n5000) 个不超过 1 0 6 10^6 106 的正整数组成的序列。请输出这个序列的最长上升子序列的长度。

最长上升子序列是指,从原序列中按顺序取出一些数字排在一起,这些数字是逐渐增大的。

输入格式

第一行,一个整数 n n n,表示序列长度。

第二行有 n n n 个整数,表示这个序列。

输出格式

一个整数表示答案。

样例 #1

样例输入 #1

6
1 2 4 1 3 4

样例输出 #1

4

提示

分别取出 1 1 1 2 2 2 3 3 3 4 4 4 即可。

#include
#include
using namespace std;
int dp[5001];
int arr[5001],ans;
int main(void)
{
	int n;
	cin >> n;
	ios::sync_with_stdio(0);
	for (int i = 1; i <= n; i++)
	{
		cin >> arr[i];
	}
	dp[1] = 1;
	for (int i = 2; i <= n; i++)
	{
		dp[i] = 1;
		for (int j = 1; j < i; j++)
		{
			if (arr[j] < arr[i])
				dp[i] = max(dp[i], dp[j] + 1);
		}
	}
	for (int i = 1; i <= n; i++)
	{
		ans = max(dp[i], ans);
	}
	cout << ans;
	return 0;
}

你可能感兴趣的:(算法经典问题,#,动态规划,刷题,算法,动态规划,c++)