zoukankan      html  css  js  c++  java
  • UVA10723 电子人的基因 Cyborg Genes

    UVA10723 电子人的基因 Cyborg Genes

    problem:

    给两个序列,求出一个最短的新序列使得输入的两个串的子序列,同时输出此时的方案数

    solution:

    可以大胆猜测这个新序列的最短长度为原来输入的序列的长度之和减去它们的最长公共子序列
    然后对一对样例发现猜想成立(滑稽)
    那么问题就转化为求最长公共子序列且求其方案数
    前者显然易求
    对于后者我们也采用dp
    (cnt_{i,j})表示第一个序列已经考虑到第i个,第二个序列已经考虑到第j个时最长公共子序列的方案数
    转移也比较简单

    code:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1005;
    int n,cnt[N][N],dp[N][N],kase;
    char ch1[N],ch2[N];
    int main()
    {
    	scanf("%d",&n);getchar();
    	while(n--)
    	{
    		gets(ch1),gets(ch2);
    		memset(dp,0,sizeof(dp));
    		memset(cnt,0,sizeof(cnt));
    		int len1=strlen(ch1),len2=strlen(ch2);
    		for(int i=0;i<=len1;++i)cnt[i][0]=1;
    		for(int i=0;i<=len2;++i)cnt[0][i]=1;
    		for(int i=1;i<=len1;++i)
    			for(int j=1;j<=len2;++j)
    			{
    				if(ch1[i-1]==ch2[j-1])
    					dp[i][j]=dp[i-1][j-1]+1,cnt[i][j]=cnt[i-1][j-1];
    				else if(dp[i-1][j]>dp[i][j-1])
    					dp[i][j]=dp[i-1][j],cnt[i][j]=cnt[i-1][j];
    				else if(dp[i][j-1]>dp[i-1][j])
    					dp[i][j]=dp[i][j-1],cnt[i][j]=cnt[i][j-1];
    				else dp[i][j]=dp[i-1][j],cnt[i][j]=cnt[i][j-1]+cnt[i-1][j];
    			}
    		printf("Case #%d: %d %d
    ",++kase,len1+len2-dp[len1][len2],cnt[len1][len2]);
    	}
    	return 0;
    }
    
  • 相关阅读:
    第十二周 张文小组学习情况总结
    第五章
    第四章
    第三章
    软工实训--学习回顾2
    软工实训-- 学习回顾1
    构建之法——读书笔记(9)
    构建之法——读书笔记(8)
    构建之法——读书笔记(7)
    第13周张文小组学习情况总结
  • 原文地址:https://www.cnblogs.com/zmyzmy/p/13751442.html
Copyright © 2011-2022 走看看