返回顶部

Educational DP Contest F - LCS (LCS输出路径)

  • 题意:有两个字符串,求他们的最长公共子序列并输出.

  • 题解:首先跑个LCS记录一下dp数组,然后根据dp数组来反着还原路径,只有当两个位置的字符相同时才输出.

  • 代码:

    char s[N],t[N];
    int dp[10000][10000];
    
    int main() {
        //ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    	scanf("%s %s",s+1,t+1);
    	int len1=strlen(s+1);
    	int len2=strlen(t+1);
    
    	for(int i=1;i<=len1;++i){
    		for(int j=1;j<=len2;++j){
    			if(s[i]==t[j]) dp[i][j]=dp[i-1][j-1]+1;
    			else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
    		}
    	}
    
    	int i=len1,j=len2;
    	char ans[N];
    	int cnt=0;
    	while(dp[i][j]){
    		if(s[i]==t[j]){
    			ans[++cnt]=s[i];
    			i--;
    			j--;
    		}
    		else if(dp[i][j]==dp[i-1][j]) i--;
    		else if(dp[i][j]==dp[i][j-1]) j--;
    	}
    
    	for(int i=cnt;i>=1;--i) printf("%c",ans[i]);
    
        return 0;
    }
    
posted @ 2020-09-05 17:20  _Kolibri  阅读(194)  评论(0)    收藏  举报