您的位置:首页 > 其它

HDU 1080 最长公共子序列变形

2012-09-01 20:41 323 查看
要注意i,j的下标是从1开始到n, m

在编码过程中,刚开始一直出错,后来发现初始少了两句

for(int i = 1; i <= n; i++)

dp[i][0] = dp[i-1][0] + r[a[i-1]][4];

for(int i = 1;i <= m; i++)

dp[0][i] = dp[0][i-1] + r[4][b[i-1]];

#include <iostream>
using namespace std;

const int N = 101;
int dp

;

int max(int a, int b)
{
if(a > b)
return a;
else
return b;
}
int main()
{
int  t;
cin >> t;
int r[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}	};
while(t--)
{
char str1
, str2
;
int a
, b
;
int n, m;
cin >> n;
cin >> str1;
cin >> m;
cin >> str2;
for(int i = 0; i < n; i++)
{
switch(str1[i])
{
case 'A':
a[i] = 0; break;
case 'C':
a[i] = 1; break;
case 'G':
a[i] = 2; break;
case 'T':
a[i] = 3; break;
case '-':
a[i] = 4; break;
default:
a[i] = 0;
}
}

for(int i = 0; i < m; i++)
{
switch(str2[i])
{
case 'A':
b[i] = 0;
break;
case 'C':
b[i] = 1; break;
case 'G':
b[i] = 2; break;
case 'T':
b[i] = 3; break;
case '-':
b[i] = 4; break;
default:
b[i] = 0;
}
}
//预处理完毕
//开始最长公共子序列

memset(dp, 0, sizeof(dp));
for(int i = 1; i <= n; i++)
dp[i][0] = dp[i-1][0] + r[a[i-1]][4];
for(int i = 1;i <= m; i++)
dp[0][i] = dp[0][i-1] + r[4][b[i-1]];
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
dp[i][j] = max(dp[i-1] [j-1] + r[a[i-1]][b[j-1]], max(dp[i][j-1] + r[4][b[j-1]], dp[i-1][j] + r[a[i-1]] [4]));
}
cout << dp
[m] << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: