学习要点
- 求最长递增字列
- 求最长递减子列
题目链接
题目描述

解法:动归求最长递增子列
cpp
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
while (cin >> n) {
// 输入的数组
int tmp;
vector<int> v;
for (int i = 0; i < n; ++i) {
cin >> tmp;
v.push_back(tmp);
}
// 最长递增子序列 从左往右
if (v.empty()) return 0;
vector<int> dp1(n, 1);
for (int i = 0; i < n; ++i) {
for (int j = 0; j < i ; ++j) {
if (v[i] > v[j]) {
dp1[i] = max(dp1[i], dp1[j] + 1);
}
}
}
// 最长递减子序列 从右往左
if (v.empty()) return 0;
vector<int> dp2(n, 1);
for(int i = n-1;i>=0;i--)
{
for(int j = n-1;j>i;j--)
{
if(v[i] > v[j])
{
dp2[i] = max(dp2[i],dp2[j]+1);
}
}
}
int result;
for(int i =0;i<n;i++)
{
result = max(result,dp1[i]+dp2[i]-1);
}
cout << n - result;
}
}
// 64 位输出请用 printf("%lld")