思路
用数组 a[n],来记录一个字符串,然后用dp[i]来记录以每一个a[i]为结尾的最长递增子序列的长度,dp数组的每一个元素初始值都为1
如果满足a[j]<a[i]则以a[i]为结尾的子序列长度是以a[j]为结尾的长度加一
状态转移方程为 dp[i]=max(dp[i],dp[j]+1)
代码
#include <iostream>
#include <algorithm>
#include <list>
using namespace std;
int a[1005], dp[1005];
list<int> v;
int main()
{
int n;
int ans = 0;
cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
for (int i = 0; i < n; i++)
{
if (dp[i] == 0)
dp[i] = 1;
for (int j = 0; j < i; j++)
{
if (a[i] > a[j])
{
dp[i] = max(dp[i], dp[j] + 1);
if (dp[i] > dp[ans])
{
ans = i;
v.push_back(a[i]);
}
}
}
}
for (int i = 0; true;i++)
{
if(a[i]<v.front())
{
v.insert(v.begin(), a[i]);
break;
}
}
cout << "最长单调递增子序列长为:" << v.size() << endl;
cout << "子序列为:";
for (list<int>::iterator it = v.begin(); it != v.end();it++)
{
cout << *it << ' ';
}
}
示例
输入
11
5 4 3 4 1 7 2 9 1 2 3
输出
最长单调递增子序列长为:4
子序列为:3 4 7 9