HDU 1080 DP
Posted yxwkaifa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 1080 DP相关的知识,希望对你有一定的参考价值。
匹配两个人相似度。
A,G,C。T。每两个都会有一个相应的值,给出两串基因。长度能够不一样,能够在基因中间加_使两串长度一样。然后有一个相应值。求最大相应值。
先做出相应的表
DP方程:
x=dp[i-1][j-1]+hash[str_a[i-1]][str_b[j-1]];
y=dp[i-1][j]+hash[str_a[i-1]][‘-‘];
z=dp[i][j-1]+hash[str_b[j-1]][‘-‘];
p[i][j]=Max(x,y,z);
#include "stdio.h" #include "string.h" int Max(int a,int b,int c) { int x; x=a; if (b>x) x=b; if (c>x) x=c; return x; } int main() { int Case,len_a,len_b,x,y,z,i,j; int dp[110][110],hash[210][210]; char str_a[110],str_b[110]; hash['A']['A']=hash['C']['C']=hash['T']['T']=hash['G']['G']=5; hash['A']['C']=hash['C']['A']=hash['A']['T']=hash['T']['A']=hash['-']['T']=hash['T']['-']=-1; hash['A']['G']=hash['G']['A']=hash['C']['T']=hash['T']['C']=hash['G']['T']=hash['T']['G']=hash['-']['G']=hash['G']['-']=-2; hash['A']['-']=hash['-']['A']=hash['C']['G']=hash['G']['C']=-3; hash['C']['-']=hash['-']['C']=-4; scanf("%d",&Case); while (Case--) { scanf("%d%s%d%s",&len_a,str_a,&len_b,str_b); // memset(dp,0,sizeof(dp)); dp[0][0]=0; for (i=1;i<=len_a;i++) dp[i][0]=dp[i-1][0]+hash['-'][str_a[i-1]]; for (i=1;i<=len_b;i++) dp[0][i]=dp[0][i-1]+hash['-'][str_b[i-1]]; for (i=1;i<=len_a;i++) for (j=1;j<=len_b;j++) { x=dp[i-1][j-1]+hash[str_a[i-1]][str_b[j-1]]; y=dp[i-1][j]+hash[str_a[i-1]]['-']; z=dp[i][j-1]+hash[str_b[j-1]]['-']; dp[i][j]=Max(x,y,z); } printf("%d\n",dp[len_a][len_b]); } return 0; }
以上是关于HDU 1080 DP的主要内容,如果未能解决你的问题,请参考以下文章
HDU3247 Resource Archiver(AC自动机+BFS+DP)
刷题总结——Human Gene Functions(hdu1080)