zoukankan      html  css  js  c++  java
  • Codeplus2017 11月赛T3——基因

    题目:https://www.luogu.org/problemnew/show/P4059

    DP,状态应分为空格或字母,可用0和1表示,据此转移,详见代码。

    另:注意初始化,因为有负值所以要先把f数组赋一个很小的值,再据题意赋值与0有关的f,特别的,f[0][0][1][1]=0。

    代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int d[5][5],A,B,a[3005],b[3005],n,m,f[3005][3005][3][3],ans;
    char dc[3005];
    int main()
    {
    //	freopen("dna.in","r",stdin);
    //	freopen("dna.out","w",stdout);
    	gets(dc);
    	n=strlen(dc);
    	for(int i=1;i<=n;i++)
    	{
    		if(dc[i-1]=='A')a[i]=1;
    		if(dc[i-1]=='T')a[i]=2;
    		if(dc[i-1]=='G')a[i]=3;
    		if(dc[i-1]=='C')a[i]=4;
    	}
    	gets(dc);
    	m=strlen(dc);
    	for(int i=1;i<=m;i++)
    	{
    		if(dc[i-1]=='A')b[i]=1;
    		if(dc[i-1]=='T')b[i]=2;
    		if(dc[i-1]=='G')b[i]=3;
    		if(dc[i-1]=='C')b[i]=4;
    	}
    	for(int i=1;i<=4;i++)
    		for(int j=1;j<=4;j++)
    			scanf("%d",&d[i][j]);
    	scanf("%d%d",&A,&B);
    	memset(f,-3,sizeof f);//!
    //	f[0][0][1][0]=f[0][0][0][1]=f[0][0][1][1]=0;//!!
    	f[0][0][1][1]=0;
    	f[1][0][1][0]=-A;
    	for(int i=2;i<=n;i++)
    		f[i][0][1][0]=f[i-1][0][1][0]-B;
    	f[0][1][0][1]=-A;
    	for(int i=2;i<=m;i++)
    		f[0][i][0][1]=f[0][i-1][0][1]-B;
    //	scanf("%d%d",&A,&B);//!!!顺序!!! 
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=m;j++)
    		{
    //			f[i][j][0][1]=max(f[i][j][0][1],f[i][j-1][1][1]-A);
    //			f[i][j][0][1]=max(f[i][j][0][1],f[i][j-1][0][1]-B);
    //			f[i][j][0][1]=max(f[i][j][0][1],f[i][j-1][1][0]-A);
    			f[i][j][0][1]=max(f[i][j-1][0][1]-B,max(f[i][j-1][1][1],f[i][j-1][1][0])-A);
    			
    //			f[i][j][1][1]=max(f[i][j][1][1],f[i-1][j-1][1][1]+d[a[i]][b[j]]);
    //			f[i][j][1][1]=max(f[i][j][1][1],f[i-1][j-1][0][1]+d[a[i]][b[j]]);
    //			f[i][j][1][1]=max(f[i][j][1][1],f[i-1][j-1][1][0]+d[a[i]][b[j]]);
    			f[i][j][1][1]=max(f[i-1][j-1][1][1],max(f[i-1][j-1][0][1],f[i-1][j-1][1][0]))+d[a[i]][b[j]];
    			
    //			f[i][j][1][0]=max(f[i][j][1][0],f[i-1][j][1][1]-A);
    //			f[i][j][1][0]=max(f[i][j][1][0],f[i-1][j][0][1]-A);
    //			f[i][j][1][0]=max(f[i][j][1][0],f[i-1][j][1][0]-B);
    			f[i][j][1][0]=max(f[i-1][j][1][0]-B,max(f[i-1][j][1][1],f[i-1][j][0][1])-A);
    		}
    	ans=max(f[n][m][1][1],max(f[n][m][0][1],f[n][m][1][0]));
    	printf("%d",ans);
    	return 0;
    }
    

      

  • 相关阅读:
    删除表
    删除表格的行或者列
    给word中的表格增加行或者列
    向word中插入表格
    设置图片的对齐方式
    day19作业
    Python入门day19——叠加多个装饰器、yield、三元表达式、生成式、函数的递归调用
    day18作业
    Python入门day18——有参装饰器
    Python入门day18——迭代器生成器
  • 原文地址:https://www.cnblogs.com/Zinn/p/8470754.html
Copyright © 2011-2022 走看看