poj 1080 (LCS变形)

Posted yoyo_sincerely

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj 1080 (LCS变形)相关的知识,希望对你有一定的参考价值。

Human Gene Functions

题意:

LCS:

设dp[i][j]为前i,j的最长公共序列长度;

dp[i][j] = dp[i-1][j-1]+1;(a[i] == b[j])

dp[i][j] = max(dp[i][j-1],dp[i-1][j]);

边界:dp[0][j] = 0(j<b.size) ,dp[i][0] = 0(i< a.size);

LCS变形:

设dp[i][j]为前i,j的最大价值:

value(x, y)为比较价值;

dp[i][j] = max(dp[i-1][j-1] + value(a[i],b[i]),dp[i][j-1] + value(‘-‘, b[i]), dp[i-1][j] + value(a[i],‘-‘);

边界:dp[i][0] = dp[i-1][0] + value(a[i],‘-‘),(i<=a.size);      dp[0][j] = dp[0][j-1] + value(‘-‘,b[i]), (j <= b.size);

边界是个大问题!!

 a[i]跟dp[i]的关系搞错.跪了整整一个小时啊!!!

#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <time.h>
#include <cmath>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>
#include <set>

#define c_false ios_base::sync_with_stdio(false); cin.tie(0)
#define INF 0x3f3f3f3f
#define INFL 0x3f3f3f3f3f3f3f3f
#define zero_(x,y) memset(x , y , sizeof(x))
#define zero(x) memset(x , 0 , sizeof(x))
#define MAX(x) memset(x , 0x3f ,sizeof(x))
#define swa(x,y) {LL s;s=x;x=y;y=s;}
using namespace std ;
#define N 105

const double PI = acos(-1.0);
typedef long long LL ;
char a[N],b[N];
int dp[N][N];

int value(char x, char y){
    if(x == y)return 5;
    else if((x == A&&y == C)||(x == C&&y == A))return -1;
    else if((x == A&&y == G)||(x == G&&y == A))return -2;
    else if((x == A&&y == T)||(x == T&&y == A))return -1;
    else if((x == C&&y == G)||(x == G&&y == C))return -3;
    else if((x == C&&y == T)||(x == T&&y == C))return -2;
    else if((x == T&&y == G)||(x == G&&y == T))return -2;
    else if((x == A&&y == -)||(x == -&&y == A))return -3;
    else if((x == C&&y == -)||(x == -&&y == C))return -4;
    else if((x == G&&y == -)||(x == -&&y == G))return -2;
    else if((x == T&&y == -)||(x == -&&y == T))return -1;
    else return 0;
}
int main(){
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int n,aL,bL;
    cin>>n;
    while(n--){
        cin>>aL;
        scanf("%s",a);
        cin>>bL;
        scanf("%s",b);
        dp[0][0] = 0;
        for(int i = 0;i < aL; i++) {dp[i+1][0] = dp[i][0] + value(a[i],-);}
        for(int i = 0;i < bL; i++) {dp[0][i+1] = dp[0][i] + value(b[i],-);}
        for(int i = 1;i <= aL; i++){
            for(int j = 1;j <= bL; j++){
                if(a[i-1] == b[j-1]) dp[i][j] = dp[i-1][j-1] + value(a[i-1], b[j-1]);
                else dp[i][j] = max(dp[i-1][j-1]+value(a[i-1],b[j-1]), max(dp[i][j-1]+value(-,b[j-1]), dp[i-1][j]+value(a[i-1],-)));
            }
        }
        cout<<dp[aL][bL]<<endl;
    }
    return 0;
}

 

以上是关于poj 1080 (LCS变形)的主要内容,如果未能解决你的问题,请参考以下文章

POJ1080Human Gene Functions(LCS变形)

LCS poj1080

poj 1080 Human Gene Functions(lcs,较难)

POJ-1080 Human Gene Functions---类似LCS

Human Gene Functions POJ 1080 最长公共子序列变形

LeetCode(LCSி)最长公共子序列&变形应用