首页 > 代码库 > poj 1080 dp
poj 1080 dp
基因配对 给出俩基因链和配对的值 求配对值得最大值 简单dp
#include<iostream>#include<stdio.h>#include<string.h>using namespace std;const int maxa = 205;const int mina = -100000000;char str1[maxa], str2[maxa];int num[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,-10000000};int a1[maxa], a2[maxa];int dp[maxa][maxa];int main(){ //freopen("in.cpp", "r", stdin); int t, n1, n2; scanf("%d", &t); while(t--){ str1[0] = 4; str2[0] = 4; scanf("%d%s", &n1, str1+1); scanf("%d%s", &n2, str2+1);//printf("*"); for(int i = 1; i <= n1; i++){ // printf("%c", str1[i]); if(str1[i] == ‘A‘) str1[i] = 0; else if(str1[i] == ‘C‘) str1[i] = 1; else if(str1[i] == ‘G‘) str1[i] = 2; else str1[i] = 3; } for(int i = 1; i <= n2; i++){//printf("%d\n", i); if(str2[i] == ‘A‘) str2[i] = 0; else if(str2[i] == ‘C‘) str2[i] = 1; else if(str2[i] == ‘G‘) str2[i] = 2; else str2[i] = 3; }//printf("*"); for(int i = 1; i <= n1; i++){ if(i == 0) a1[i] = num[str1[i]][4]; else a1[i] = num[str1[i]][4] + a1[i-1]; } for(int i = 1; i <= n2; i++){ if(i == 0) a2[i] = num[str2[i]][4]; else a2[i] = num[str2[i]][4] + a2[i-1]; } /*for(int i =0; i <= n1; i++){ printf("%d ", a1[i]); }puts("");*/ for(int i = 0;i <= n1; i++){ for(int k = 0; k <= n2; k++){ dp[i][k] = mina; } } for(int i = 0; i <= n2; i++){ if(i == 0) dp[1][i] = num[str1[1]][str2[i]]; else dp[1][i] = num[str1[1]][str2[i]] + a2[i-1]-a2[0]; } for(int i = 2; i <= n1; i++){ dp[i][0] = a1[i] - a1[0]; for(int k = 1; k <= n2; k++){ dp[i][k] = max(dp[i][k], dp[i-1][k]+ num[str1[i]][4]); for(int j = 0; j < k; j++){ dp[i][k] = max(dp[i][k],dp[i-1][j] + num[str1[i]][str2[k]] + a2[k-1] - a2[j]); } } } /*for(int i = 1; i <= n1; i++){ printf("*%d ", num[str1[i]][str2[1]]+a1[i-1]-a1[0]); }puts("");; for(int i = 0; i <= n1; i++){ for(int k = 0; k <= n2; k++){ printf("%d%d %d ",str1[i], str2[k], dp[i][k]); }puts(""); }*/ int ans = mina; for(int i = 0; i <= n2; i++){ ans = max(ans, dp[n1][i] + a2[n2] - a2[i]); // printf("%d ", dp[n1][i] + a2[n2] - a2[i]); }//puts(""); for(int i = 0; i <= n1; i++){ ans = max(ans, dp[i][n2]+a1[n1] - a1[i]); //printf("%d ", dp[i][n2]+a1[n1] - a1[i]); }//puts(""); printf("%d\n", ans); }}
poj 1080 dp
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。