POJ 1080 dp

//11175259	c00h00g	1080	Accepted	640K	0MS	G++	1444B	2013-01-14 16:18:02
//题意:根据给定的矩阵,求两个字符串的最大相似度
//转移方程为 dp[i][j]=max(dp[i-1][j-1]+mat[a[i]][b[j]],dp[i][j-1]+mat['-'][b[j]],dp[i-1][j]+mat['-'][a[i]]);
//边界:dp[0][0]=0,dp[i][0]表示a数组的前i个字符和'-'匹配得到的值,dp[0][i]表示b数组的前i个字符和'-'匹配后的字符 
#include<stdio.h>
#include<stdlib.h>
#include<map>
#include<algorithm>
using namespace std;

int dp[105][105];
int T,n1,n2;
char a[105],b[105];
map<char,int> Map;
int mat[6][6];

void init(){
    Map['A']=1;
    Map['C']=2;
    Map['G']=3;
    Map['T']=4;
    Map['-']=5;
    mat[1][1]=mat[2][2]=mat[3][3]=mat[4][4]=5;
    mat[1][2]=mat[2][1]=-1;
    mat[1][3]=mat[3][1]=-2;
    mat[1][4]=mat[4][1]=-1;
    mat[1][5]=mat[5][1]=-3;
    mat[2][3]=mat[3][2]=-3;
    mat[2][4]=mat[4][2]=-2;
    mat[2][5]=mat[5][2]=-4;
    mat[3][4]=mat[4][3]=-2;
    mat[3][5]=mat[5][3]=-2;
    mat[4][5]=mat[5][4]=-1;
    //初始化dp[i][0]
    dp[0][0]=0;
    int sum=0;
    for(int i=1;i<=n1;i++){
        sum+=mat[Map[a[i]]][Map['-']];
        dp[i][0]=sum;
    }
    sum=0;
    for(int i=1;i<=n2;i++){
        sum+=mat[Map['-']][Map[b[i]]];
        dp[0][i]=sum;
    }
}

int max3(int a,int b,int c){return max(a,max(b,c));}

int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n1); scanf("%s",a+1);
        scanf("%d",&n2); scanf("%s",b+1);
        init();
        for(int i=1;i<=n1;i++){
            for(int j=1;j<=n2;j++){
                dp[i][j]=max3(dp[i-1][j-1]+mat[Map[a[i]]][Map[b[j]]],
                dp[i][j-1]+mat[Map[b[j]]][Map['-']],
                dp[i-1][j]+mat[Map['-']][Map[a[i]]]);
            } 
        }
        printf("%d\n",dp[n1][n2]);
    }  
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值