首页 > 代码库 > poj1080 dp
poj1080 dp
1 //Accepted 200 KB 0 ms 2 //dp 3 //dp[i][j]表示s1用前i个,s2用前j个字符能得到的最大分数 4 //dp[i][j]=max(dp[i-1][j]+score[s1[i-1]][‘-‘], 5 // dp[i][j-1]+score[[‘-‘][s2[j-1]], 6 // dp[i-1][j-1]+score[s1[i-1]][s2[j-1]]) 7 //注意初始化 8 //dp[0][0]=0; 9 //dp[0][i]=dp[0][i-1]+score[‘-‘][s2[i-1]]10 //dp[i][0]=dp[i-1][0]+score[s1[i-1]][‘-‘]11 //还要初始化dp[i][j]=-inf;12 #include <cstdio>13 #include <cstring>14 #include <iostream>15 using namespace std;16 const int imax_n = 105;17 const int inf = -1000000;18 int dp[imax_n][imax_n];19 int n1,n2;20 char s1[imax_n];21 char s2[imax_n];22 int getScore(char ch1,char ch2)23 {24 if (ch1==ch2) return 5;25 if (ch1==‘A‘ && ch2==‘C‘) return -1;26 if (ch1==‘A‘ && ch2==‘G‘) return -2;27 if (ch1==‘A‘ && ch2==‘T‘) return -1;28 if (ch1==‘A‘ && ch2==‘-‘) return -3;29 if (ch1==‘C‘)30 {31 if (ch2==‘A‘) return -1;32 if (ch2==‘G‘) return -3;33 if (ch2==‘T‘) return -2;34 if (ch2==‘-‘) return -4;35 }36 if (ch1==‘G‘)37 {38 if (ch2==‘A‘) return -2;39 if (ch2==‘C‘) return -3;40 if (ch2==‘T‘) return -2;41 if (ch2==‘-‘) return -2;42 }43 if (ch1==‘T‘)44 {45 if (ch2==‘A‘) return -1;46 if (ch2==‘C‘) return -2;47 if (ch2==‘G‘) return -2;48 if (ch2==‘-‘) return -1;49 }50 if (ch1==‘-‘)51 {52 if (ch2==‘A‘) return -3;53 if (ch2==‘C‘) return -4;54 if (ch2==‘G‘) return -2;55 if (ch2==‘T‘) return -1;56 }57 }58 void Dp()59 {60 //memset(dp,0,sizeof(dp));61 dp[0][0]=0;62 for (int i=1;i<=n1;i++)63 dp[i][0]=dp[i-1][0]+getScore(s1[i-1],‘-‘);64 for (int i=1;i<=n2;i++)65 dp[0][i]=dp[0][i-1]+getScore(‘-‘,s2[i-1]);66 for (int i=1;i<=n1;i++)67 {68 for (int j=1;j<=n2;j++)69 {70 dp[i][j]=inf;71 if (dp[i][j-1]+getScore(‘-‘,s2[j-1])>dp[i][j])72 dp[i][j]=dp[i][j-1]+getScore(‘-‘,s2[j-1]);73 if (dp[i][j]<dp[i-1][j]+getScore(s1[i-1],‘-‘))74 dp[i][j]=dp[i-1][j]+getScore(s1[i-1],‘-‘);75 if (dp[i][j]<dp[i-1][j-1]+getScore(s1[i-1],s2[j-1]))76 dp[i][j]=dp[i-1][j-1]+getScore(s1[i-1],s2[j-1]);77 }78 }79 printf("%d\n",dp[n1][n2]);80 }81 int main()82 {83 int T;84 scanf("%d",&T);85 while (T--)86 {87 scanf("%d",&n1);88 scanf("%s",s1);89 scanf("%d",&n2);90 scanf("%s",s2);91 Dp();92 }93 return 0;94 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。