又经典的DP题LCS改编
原来的LCS是求最长公共子序列
这里把长度换成了权重
- #include <cstdlib>
- #include <iostream>
- #include <cstdio>
- using namespace std;
- const int MAXN = 101;
- const int MAX = 99999999;
- const int point[5][5] = {{5, -1, -2, -1, -3}, {-1, 5, -3, -2, -4}, {-2, -3, 5, -2, -2},
- {-1, -2, -2, 5, -1}, {-3, -4, -2, -1, 0}};
- int f[MAXN][MAXN], data[2][MAXN], num[2];
- int main()
- {
- int cases;
- cin>>cases;
- while (cases--)
- {
- int i,j;
- for (i = 0; i < 2; i ++)
- {
- scanf("%d",num+i);getchar();
- char ch;
- for (j = 0; j < num[i]; j++)
- {
- ch = getchar();
- switch (ch)
- {
- case 'A':
- data[i][j] = 0;
- break;
- case 'C':
- data[i][j] = 1;
- break;
- case 'G':
- data[i][j] = 2;
- break;
- case 'T':
- data[i][j] = 3;
- break;
- }
- }
- }
- int u,v;
- for (u = 0; u < MAXN; u++ )
- for (v = 0; v < MAXN; v++)
- f[u][v] = -MAX;
- f[0][0] = 0;
- for (u = 0; u <= num[0]; ++u)
- {
- for (v = 0; v <= num[1]; ++v)
- {
- if (f[u+1][v+1] < f[u][v] + point[data[0][u]][data[1][v]])
- f[u+1][v+1] = f[u][v] + point[data[0][u]][data[1][v]];
- if (f[u][v+1] < f[u][v] + point[4][data[1][v]])
- f[u][v+1] = f[u][v] + point[4][data[1][v]];
- if (f[u+1][v] < f[u][v] + point[data[0][u]][4])
- f[u+1][v] = f[u][v] + point[data[0][u]][4];
- }
- }
- cout<<f[num[0]][num[1]]<<endl;
- }
- return 0;
- }