最长公共递增子序列(C++实现)

典型的动态规划题目,可以吧题目转化为最长公共子序列问题,输入一个序列,然后将其排序,储存在另一个数组中。

然后求两个数组的最长公共子序列,求出的最长公共子序列即为输入序列的最长递增子序列。本文还有一个关键部分就

是输出所有的最长递增子序列,代码中使用了一个path[N+1][N+1]数组记录过程,并用回溯的方法输出。

#include

#include
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<     }
    if(path[i][j] == 1)
        print(dp[i-1][j],i-1,j);
    if(path[i][j] == 2)
        print(dp[i][j-1],i,j-1);
}
int LCSL(int len)
{
    int i , j ;
    for( i = 0 ; i <= len; i++ )//初始化
    {
        dp[i][0] = 0 ;dp[0][i] = 0 ;
    }
    for( i = 1 ; i<= len ; i++)
        for( j = 1 ; j <= len ; j++)
        {
            if(str1[i - 1] == str2[j - 1])
            {
                dp[i][j] = dp[i - 1][ j - 1] + 1;
                path[i][j] = 0;//左上
            }
            else
            {
                if(dp[i - 1][ j ] >= dp[i][j - 1])
                {
                    dp[i][j] = dp[i - 1][ j ];
                    path[i][j] = 1;//上
                }
                else
                {
                    dp[i][j] = dp[i][j - 1];
                    path[i][j] = 2;//右
                }
            }
        }
    for(i=0;i<=len;i++) //输出dp[][]和path[][],括号里为path[][]
    {
        for(j=0;j<=len;j++)
            cout<         cout<     }
    for(i=0;i<=len;i++)
    {
        for(j=0;j<=len;j++)
        {
            if(dp[i][j] == dp[len][len] && path[i][j] == 0)
            {
                print(dp[len][len],i,j);
                cout<             }
        }
    }
    return dp[len][len];
}
void sort(int num)
{
    for(int i=0;i         for(int j=0;j         {
            if(str2[j]>str2[j+1])
            {
                char ch;
                ch = str2[j];
                str2[j] = str2[j+1];
                str2[j+1] = ch;
            }
        }
}
int main()
{
    int num;
    cout<<"输入字符个数:";
    cin>>num;
    cout<<"输入"<     for(int i=0;i     {
        cin>>str1[i];
        str2[i] = str1[i];
    }
    sort(num);
    LCSL(num);
    system("pause");
      return 0;
}

你可能感兴趣的:(动态规划)