关闭

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

标签: c++pathsystem
2625人阅读 评论(1) 收藏 举报
分类:

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

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

是输出所有的最长递增子序列,代码中使用了一个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);
    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<<dp[i][j]<<"("<<path[i][j]<<")"<<" ";
        cout<<endl;
    }
    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<<endl;
            }
        }
    }
    return dp[len][len];
}
void sort(int num)
{
    for(int i=0;i<num-1;i++)
        for(int j=0;j<num-1-i;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<<"输入"<<num<<"个字符"<<endl;
    for(int i=0;i<num;i++)
    {
        cin>>str1[i];
        str2[i] = str1[i];
    }
    sort(num);
    LCSL(num);
    system("pause");
      return 0;
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:69600次
    • 积分:1175
    • 等级:
    • 排名:千里之外
    • 原创:50篇
    • 转载:4篇
    • 译文:0篇
    • 评论:3条
    最新评论