• 啊哈哈哈哈,路径路径


    POJ - 2250
    一步一步谨谨慎慎得就过了。

    #include<iostream>
    #include<cstdio>
    #include<math.h>
    #include<stdlib.h>
    #include<vector>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    typedef long long LL;
    #define INF 0x3f3f3f3f
    #define PI acos(-1.0)
    #define N 210
    
    /**--LCS的路径输出--**/
    
    char s1[110][35];
    char s2[110][35];
    int vis[110][110];
    int dp[110][110];
    int len1,len2;
    char ans[110][35];
    int num;
    
    void debug()
    {
        for(int i=0;i<=len1;i++)
        {
            for(int j=0;j<=len2;j++)
            {
                printf("%d ",dp[i][j]);
            }
            printf("
    ");
        }
        for(int i=0;i<=len1;i++)
        {
            for(int j=0;j<=len2;j++)
            {
                printf("%3d",vis[i][j]);
            }
            printf("
    ");
        }
    }
    
    void shuchu(int i,int j)
    {
        if(i==0||j==0)
        {
            return;
        }
        if(vis[i][j]==0)
        {
            shuchu(i-1,j-1);
            strcpy(ans[num++],s1[i]);
        }
        else if(vis[i][j]==-1)
        {
            shuchu(i-1,j);
        }
        else if(vis[i][j]==1)
        {
            shuchu(i,j-1);
        }
    }
    
    
    void LCS()
    {
        for(int i=0;i<=len1;i++)
        {
            vis[i][0]=-1;
        }
        for(int i=0;i<=len2;i++)
        {
            vis[0][i]=1;
        }
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=len1;i++)
        {
            for(int j=1;j<=len2;j++)
            {
                if(strcmp(s1[i],s2[j])==0)
                {
                    dp[i][j]=dp[i-1][j-1]+1;
                    vis[i][j]=0;
                }
                else
                {
                    if(dp[i-1][j]>dp[i][j-1])
                    {
                        dp[i][j]=dp[i-1][j];
                        vis[i][j]=-1;
                    }
                    else
                    {
                        dp[i][j]=dp[i][j-1];
                        vis[i][j]=1;
                    }
                }
            }
        }
        //debug();
        num=0;
        shuchu(len1,len2);
        printf("%s",ans[0]);
        for(int i=1;i<num;i++)
        {
            printf(" %s",ans[i]);
        }
        printf("
    ");
    }
    
    int main()
    {
        while(~scanf("%s",s1[1]))
        {
            len1=1;
            if(strcmp(s1[1],"#")!=0)
            {
                len1=2;
                while(scanf("%s",s1[len1])&&strcmp(s1[len1],"#")!=0)
                {
                    len1++;
                }
            }
            len2=1;
            scanf("%s",s2[len2]);
            if(strcmp(s2[len2],"#")!=0)
            {
                len2+=1;
                while(scanf("%s",s2[len2])&&strcmp(s2[len2],"#")!=0)
                {
                    len2++;
                }
            }
            len1-=1;len2-=1;
            //printf("%d %d
    ",len1,len2);
            LCS();
        }
        return 0;
    }
    
    
    
  • 相关阅读:
    51nod_1445 变色DNA 最短路模板 奇妙思维
    51nod_1459 最短路 dijkstra 特调参数
    UVA_10653 公主与王子 #刘汝佳DP题刷完计划
    HOJ 13819 Height map
    51nod_1255字典序最小的子序列
    电梯设计需求调研报告
    梦断代码读后感
    求一循环数组的最大子数组的和
    求二维数组中最大子数组的和
    四则运算
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934548.html
Copyright © 2020-2023  润新知