问题描述:
解题思路:
LIS模板题:求最长上升子序列。
下图为关于取max的解释:
题解:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 9;
int a[N], dp[N];
int main()
{
int n;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);
// 从dp[j]状态转移到dp[i], dp[i]以i结尾的最长(max)子序列长度
// 为什么要取max,因为以i下标结尾的上升子序列可能有多个,都是从上一个dp[j]继承过来,为了找到最大继承就需要取max
}
}
int ans = 0;
for(int i = 1; i <= n; i++)ans = max(ans, dp[i]);
cout << ans << '\n';
return 0;
}
知识点:LIS