HDU1080 【LCS变形】
题意:
给你每种字符匹配的权值大小,给你两个串,长度小的串可以在小串里面添加空格和大串匹配,问你一个最大匹配权值。
思路:
有点类似于LCS吧,我们在求两个串的LCS的时候,不行的就扔掉了,在这里就是不行的就给他匹配了一个空格;
dp[i][j-1] j匹配空格;
dp[i-1][j] i匹配空格;
dp[i-1][j-1] i和j匹配;
初始化
dp[i][0] i匹配空格
dp[0][j] j匹配空格
#include <bits/stdc++.h> using namespace std; typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int>PII; const double eps=1e-5; const double pi=acos(-1.0); const int INF=0x3f3f3f3f; int temp[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 change(char x) { if(x=='A') return 0; if(x=='C') return 1; if(x=='G') return 2; if(x=='T') return 3; return 4; } int s1[110]; int s2[110]; int dp[110][110]; char s[110]; int main() { int len1,len2; int T; scanf("%d",&T); while(T--) { scanf("%d%s",&len1,s+1); // memset(dp,0,sizeof(dp)); dp[0][0]=0; memset(s1,0,sizeof(s1)); memset(s2,0,sizeof(s2)); for(int i=1;i<=len1;i++) { s1[i]=change(s[i]); dp[i][0]=dp[i-1][0]+temp[s1[i]][4]; } scanf("%d%s",&len2,s+1); for(int i=1;i<=len2;i++) { s2[i]=change(s[i]); dp[0][i]=dp[0][i-1]+temp[4][s2[i]]; } for(int i=1;i<=len1;i++) { for(int j=1;j<=len2;j++) { dp[i][j]=-INF; dp[i][j]=max(dp[i][j],max(dp[i-1][j-1]+temp[s1[i]][s2[j]],max(dp[i-1][j]+temp[s1[i]][4],dp[i][j-1]+temp[4][s2[j]]))); } } printf("%d\n",dp[len1][len2]); } return 0; }