典型的动态规划题目,可以吧题目转化为最长公共子序列问题,输入一个序列,然后将其排序,储存在另一个数组中。
然后求两个数组的最长公共子序列,求出的最长公共子序列即为输入序列的最长递增子序列。本文还有一个关键部分就
是输出所有的最长递增子序列,代码中使用了一个path[N+1][N+1]数组记录过程,并用回溯的方法输出。
#include <iostream>
#include<string>using namespace std;
const int N = 100;
int dp[N+1][N+1] ;
int path[N+1][N+1];//记录路径
char str1[N],str2[N];
void print(int t,int i,int j)//是用回溯的方法输出,输出path[i][j]为0的点
{
if(t == 0)
return ;
if(path[i][j] == 0)
{
print(dp[i-1][j-1],i-1,j-1);
cout<<str2[j-1];
}
if(path[i][j] == 1)
print(dp[i-1][j],i-1,j)