poj 1080 最长公共子串变形

来源:互联网 发布:上虞区干部网络教育 编辑:程序博客网 时间:2024/06/13 06:06

给出两个串,根据给出的字符之间的相似度 求 最大相似度。。

很明显的 LCS变形,只要注意下 初始条件就可以了

#include<stdio.h>#include<string.h>#define max(a,b,c) ((a)>(b)?(a)>(c)?(a):(c):(b)>(c)?(b):(c))const int maxn=105;char s[maxn],t[maxn];int dp[maxn][maxn];int slen,tlen;char map[]={'A','C','G','T'};int table[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 getid(char c){for(int i=0;i<4;i++)if(map[i]==c)return i;return 0;}int main(){int n;scanf("%d",&n);while(n--){scanf("%d%s",&slen,s);scanf("%d%s",&tlen,t);int ids,idt;dp[0][0]=0;for(int i=0;i<slen;i++){ids=getid(s[i]);dp[i+1][0]=dp[i][0]+table[ids][4];for(int j=0;j<tlen;j++){idt=getid(t[j]);dp[0][j+1]=dp[0][j]+table[4][idt];int a=dp[i+1][j]+table[4][idt];int b=dp[i][j+1]+table[ids][4];int c=dp[i][j]+table[ids][idt];dp[i+1][j+1]=max(a,b,c);}}printf("%d\n",dp[slen][tlen]);}}