51nod 1006(输出其中一个最长上升子序列)

来源:互联网 发布:天津日报大厦14楼 知乎 编辑:程序博客网 时间:2024/05/21 12:42

中文题意,详解过程参考下面这位大神的博客,非常非常非常简限易懂。

http://blog.csdn.net/hrn1216/article/details/51534607


#include<bits/stdc++.h>using namespace std;char s[1100],s1[1100];int dp[1100][1100];int main(){    while(~scanf("%s%s",s+1,s1+1))    {        memset(dp,0,sizeof(dp));        int len=strlen(s+1);        int len1=strlen(s1+1);        for(int i=1; i<=len; i++)            for(int j=1; j<=len1; j++)            {                if(s[i]==s1[j])                    dp[i][j]=dp[i-1][j-1]+1;                else                    dp[i][j]=max(dp[i-1][j],dp[i][j-1]);            }        char path[1100];        int k=0,i=len,j=len1;        while(i>=1&&j>=1)//倒着输出子序列        {            if(s[i]==s1[j])            {                path[k++]=s[i];                i--,j--;            }            else            {                if(dp[i][j-1]>dp[i-1][j])                    j--;                else                    i--;            }        }        for(int i=k-1;i>=0;i--)            printf("%c",path[i]);        printf("\n");        //cout<<dp[len][len1]<<endl;    }    return 0;}