您的位置:首页 > 其它

hdu 1080 (DP LCS最长公共子序列)

2013-05-06 11:07 399 查看
dp[i][j]=max( max( max(dp[i-1][j]+map[s[i]]['-'], d[i][j-1]+map['-'][ss[j]])

,

dp[i-1][j-1]+map[s[i]][ss[j]]

)

,

dp[i][j]

);

View Code

#include<stdio.h>
#include<string.h>
#include<math.h>
int map[6][6]={
0,0,0,0,0,0,
0,5,-1,-2,-1,-3,
0,-1,5,-3,-2,-4,
0,-2,-3,5,-2,-2,
0,-1,-2,-2,5,-1,
0,-3,-4,-2,-1,-100000
};
int fun(char ch)
{
if(ch=='A')return 1;
if(ch=='C')return 2;
if(ch=='G')return 3;
if(ch=='T')return 4;
return 5;
}
int Max(int x,int y)
{
return x>y?x:y;
}
int main()
{
int t,n,m,dp[110][110];

int i,j,k,a,b,c;
char s1[110],s2[110];
scanf("%d",&t);
while(t--)
{
scanf("%d %s",&n,s1+1);
scanf("%d %s",&m,s2+1);
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
{
a=fun(s1[i]);
b=fun('-');
dp[i][0]=dp[i-1][0]+map[a][b];

}

for(j=1;j<=m;j++)
{
a=fun('-');
b=fun(s2[j]);
dp[0][j]=dp[0][j-1]+map[a][b];
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
a=fun(s1[i]);
b=fun(s2[j]);
c=fun('-');
dp[i][j]=Max(dp[i-1][j]+map[a][c],dp[i][j-1]+map[c][b]);
dp[i][j]=Max(dp[i][j],dp[i-1][j-1]+map[a][b]);
}
}
printf("%d\n",dp
[m]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: