zoukankan      html  css  js  c++  java
  • POJ1080

    一道字符串DP,然而不需要状压之类的玄学操作

    题目大意:给你两个串,由'A','C','G','T'组成,现在你可以在这两个串中的某些位置插入'-',最终要使得它们的长度相等

    给出两个字符匹配时的匹配度表格(题面中给出),让你求如何添加'-'使得总匹配度最大

    很简单的DP,我们用f[i][j]表示使用了第一个串中前i个字符,第二个串中前j个字符(注意一定是使用了,即人为填上去的'-'不算)

    然后对于每一个位置都有三种选择:

    • 让两个串相应位置上的字符直接匹配,即f[i][j]=max(f[i][j],f[i-1][j-1]+g[s1[i]][s2[j]]

    • 在第一个串中填入一个'-',即f[i][j]=max(f[i][j],f[i][j-1]+g['-'][s2[j]]

    • 在第二个串中填入一个'-',即f[i][j]=max(f[i][j],f[i-1][j]+g[s1[i]]['-']

    最后的ans就是f[len1][len2]

    CODE

    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int N=105,g[5][5]=
    {
    	{5,-1,-2,-1,-3},
    	{-1,5,-3,-2,-4},
    	{-2,-3,5,-2,-2},
    	{-1,-2,-2,5,-1},
    	{-3,-4,-2,-1,0},
    };
    int f[N<<1][N<<1],t,len1,len2;
    char s1[N],s2[N];
    inline int get(char ch)
    {
    	if (ch=='A') return 0;
    	if (ch=='C') return 1;
    	if (ch=='G') return 2;
    	if (ch=='T') return 3;
    	if (ch=='-') return 4;
    }
    inline int max(int a,int b)
    {
    	return a>b?a:b;
    }
    int main()
    {
    	register int i,j; scanf("%d",&t);
    	while (t--)
    	{
    		scanf("%d",&len1); scanf("%s",s1+1);
    		scanf("%d",&len2); scanf("%s",s2+1);
    		memset(f,167,sizeof(f)); f[0][0]=0;
    		for (i=1;i<=len1;++i)
    		f[i][0]=f[i-1][0]+g[get(s1[i])][get('-')];
    		for (i=1;i<=len2;++i)
    		f[0][i]=f[0][i-1]+g[get('-')][get(s2[i])];
    		for (i=1;i<=len1;++i)
    		for (j=1;j<=len2;++j)
    		{	
    			f[i][j]=max(f[i][j],f[i-1][j]+g[get(s1[i])][get('-')]);
    			f[i][j]=max(f[i][j],f[i][j-1]+g[get('-')][get(s2[j])]);
    			f[i][j]=max(f[i][j],f[i-1][j-1]+g[get(s1[i])][get(s2[j])]);
    		}
    		printf("%d
    ",f[len1][len2]);
    	}
    	return 0;
    }
    

    其实这个很显然也可以滚存,但我实在懒得写了

  • 相关阅读:
    322. Coin Change
    368.[LeetCode] Largest Divisible Subset
    c++
    python 循环
    2018今日头条
    c++中set的用法
    [LeetCode]48. Rotate Image 旋转图片
    [LeetCode]47. Permutations II
    [LeetCode]46. Permutations
    sys与os模块(转载)
  • 原文地址:https://www.cnblogs.com/cjjsb/p/9028878.html
Copyright © 2011-2022 走看看