HDU 1080 Human Gene Functions
DP,比较容易想到是2维DP,表示到第一个字符串的i和第二个字符串的j最大值是多少, 字符串下标的0在这里对应的i,j是1
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> using namespace std; const int INF=-(1<<29); char s1[105], s2[105]; int dist[151][151], dp[105][105]; void init() { dist['A']['A']=5; dist['A']['C']=dist['C']['A']=-1; dist['A']['G']=dist['G']['A']=-2; dist['A']['T']=dist['T']['A']=-1; dist['A']['-']=dist['-']['A']=-3; dist['C']['C']=5; dist['C']['G']=dist['G']['C']=-3; dist['C']['T']=dist['T']['C']=-2; dist['C']['-']=dist['-']['C']=-4; dist['G']['G']=5; dist['G']['T']=dist['T']['G']=-2; dist['G']['-']=dist['-']['G']=-2; dist['T']['T']=5; dist['T']['-']=dist['-']['T']=-1; } int main() { int T, l1, l2, i, j, ti, tj, r1, r2; scanf("%d",&T); init(); while(T--) { scanf("%d%s%d%s",&l1,s1,&l2,s2); for(i=0;i<=l1;i++) for(j=0;j<=l2;j++) dp[i][j]=INF; dp[0][0]=0; for(i=0;i<l1;i++) dp[i+1][0]=dist[s1[i]]['-']+dp[i][0]; for(i=0;i<l2;i++) dp[0][i+1]=dist['-'][s2[i]]+dp[0][i]; for(i=0;i<l1;i++) for(j=0;j<l2;j++) { ti=i+1, tj=j+1; dp[ti][tj]=max(dp[ti][tj],dp[ti-1][tj-1]+dist[s1[i]][s2[j]]); dp[ti][tj]=max(dp[ti][tj],dp[ti-1][tj]+dist[s1[i]]['-']); dp[ti][tj]=max(dp[ti][tj],dp[ti][tj-1]+dist['-'][s2[j]]); } printf("%d\n",dp[l1][l2]); } return 0; }