poj 1080 zoj 1027(最长公共子序列变种)

http://poj.org/problem?id=1080

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=27

 

/*

zoj 1027   poj 1080 思路: 

三种状态,取最大值:

s1[i]和s2[j]配 :dp[i-1][j-1]+cost[my[s1[i]]][my[s2[j]]];

s1[i]和'-' 配: dp[i-1][j]+cost[my[s1[i]]][my['-']];

s2[j]和'-' 配: dp[i][j-1]+cost[my['-']][my[s2[j]]];

注意边界:

d[i][0]= cost[my[s1[i]]][my['-']]+dp[i-1][0]; 只能全部和'-'配,

同理: dp[0][j]=cost[my['-']][my[s2[j]]]+dp[0][j-1];

*/

#include <iostream>

#include <map>

#include <cstring>

#include <string>

using namespace std;

int cost[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,-100000005}};

int dp[1005][1005];

string s1,s2;

map<char,int> my;

int main(int argc, char *argv[])

{

	int t,i,n,j,m;

	my['A']=0; my['C']=1; my['G']=2; my['T']=3; my['-']=4;

	cin>>t;

	while(t--)

	{

		cin>>n>>s1>>m>>s2;

		s1='0'+s1; s2='0'+s2;

		dp[0][0]=0;

		for(i=1;i<=n;i++)

			dp[i][0]=cost[my[s1[i]]][my['-']]+dp[i-1][0];

		for(j=1;j<=m;j++)

			dp[0][j]=cost[my['-']][my[s2[j]]]+dp[0][j-1];

		for(i=1;i<=n;i++)

		for(j=1;j<=m;j++)

		{

			int t1,t2,t3;

			t1=dp[i-1][j-1]+cost[my[s1[i]]][my[s2[j]]];

			t2=dp[i-1][j]+cost[my[s1[i]]][my['-']];

			t3=dp[i][j-1]+cost[my['-']][my[s2[j]]];

			t1=max(t1,t2);  t1=max(t1,t3);

			dp[i][j]=t1;	

		}

		cout<<dp[n][m]<<endl;

	}

	return 0;

}


 

 

你可能感兴趣的:(poj)