您的位置:首页 > 其它

poj 1080 Human Gene Functions

2015-09-08 23:34 627 查看
针对三种情况进行最大值的求解,规模为100,只有使用动态规划。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <cmath>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <ctime>

#define pb push_back
#define ll long long
#define mp make_pair
#define f first
#define s second
#define pii pair < int, int >
#define ull unsigned long long
#define pll pair < ll, ll >
#define forit(s) for(__typeof(s.begin()) it = s.begin(); it != s.end(); it ++)
#define all(s) s.begin(), s.end()

const int inf = (1ll << 31) - 1;
const int maxn = (int) 1e5 + 10;
#define max(a, b) ((a) > (b) ? (a) : (b))
#define min(a, b) ((a) < (b) ? (a) : (b))
using namespace std;
int matrix[5][5] = {{-19931117, -3, -4, -2, -1},
{-3, 5, -1, -2, -1},
{-4, -1, 5, -3, -2},
{-2, -2, -3, 5, -2},
{-1, -1, -2, -2, 5}};
int dp[110][110];
char s1[110], s2[110];
int T = 0, len1 = 0, len2 = 0;
int change(char a)
{
if (a == 'A')
{
return 1;
}else if (a == 'C')
{
return 2;
}else if (a == 'G')
{
return 3;
}else if (a == 'T')
{
return 4;
}else
{
return 0;
}
}
int comp(char a, char b)
{
int r = 0;
int c = 0;
r = change(a);
c = change(b);
return matrix[r][c];
}
int main()
{
//freopen("data_1080.txt", "r", stdin);
while(scanf("%d", &T) != EOF)
{
for (int t = 0; t < T; t++)
{
memset(dp, 0, sizeof(dp));
scanf("%d%s", &len1, s1);
scanf("%d%s", &len2, s2);
dp[0][0] = 0;
char *s11, *s22;
s11= s1 - 1;
s22 = s2 - 1;

for (int i = 1; i <= len1; i++)
{
dp[i][0] = dp[i - 1][0] + comp(s11[i], 0);
}
for (int i = 1; i <= len2; i++)
{
dp[0][i] = dp[0][i - 1] + comp(s22[i], 0);
}
for (int i = 1; i <= len1; i++)
{
for (int j = 1; j <= len2; j++)
{
dp[i][j] = dp[i][j - 1] + comp(s22[j], 0);
dp[i][j] = max(dp[i][j], dp[i-1][j] + comp(s11[i], 0));
dp[i][j] = max(dp[i][j], dp[i-1][j-1] + comp(s11[i], s22[j]));
}
}
printf("%d\n", dp[len1][len2]);
}
}
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: