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;
}


原文地址:https://www.cnblogs.com/riskyer/p/3260286.html