zoukankan      html  css  js  c++  java
  • 动态规划(dp)----公共子序列(LCS) 问题进一步理解(LCS输入)

    相对于上一篇 初级 ,这道题稍加深难度,下面这题,比上面多了一个最长子序列的输出,测试一下理解程度,逆序过程

     

     51nod1006

    给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)
    比如两个串为:
     
    abcicba
    abdkscab
     
    ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
    Input

    第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000)

    Output
    输出最长的子序列,如果有多个,随意输出1个。
     
    Input示例
    abcicba
    abdkscab
     
    Output示例
    abca
    #include <stdio.h>
    #include <iostream>
    #include <string.h>
    const int maxn=1005;
    int dp[maxn][maxn]={0};
    using namespace std;
    int main(){
    	char a[maxn],b[maxn],lcs[maxn];
    	int i,j;
    	scanf("%s %s",a,b);
    	int lena=strlen(a),lenb=strlen(b);
    	for(i=1;i<=lena;i++){   
    		for(j=1;j<=lenb;j++){ 
    			if(a[i-1]==b[j-1]) dp[i][j]=dp[i-1][j-1]+1;
    			else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); 
    			//0 1取不取,两种情况取最大                                 
    		}
    	}
    	i=lena,j=lenb;            
                                  
    	int len=dp[lena][lenb];  
        lcs[len]='';       
        while(dp[i][j]){   
    		if(dp[i][j]==dp[i-1][j]) i--;     
    		else if(dp[i][j]==dp[i][j-1]) j--;  
    		else lcs[--len]=a[i-1],i--,j--;   //--len i-1  边边角角的小细节,,要注意下 
        } 
        printf("%s
    ",lcs);
    	return 0;
    }
    
  • 相关阅读:
    第24课 #pragma使用分析
    第23课 #error和#line使用分析
    第22课 条件编译使用分析
    第21课 宏定义与使用分析
    Codeforces Round #142 (Div. 2)B. T-primes
    SPOJ XMAX
    Uva 10036
    Timus 1009. K-based Numbers
    MBLAST
    ROADS
  • 原文地址:https://www.cnblogs.com/z-712/p/11134614.html
Copyright © 2011-2022 走看看