P1140 相似基因

原题链接 参考文章
一道很正常的线性DP,但是没想出来。
提醒自己要多想想dp[i][j]dp[i-1][j-1]dp[i-1][j]dp[i][j-1]之间的关系。
(也可能是洛谷把它标成区间DP误导了

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define double long double
#define endl '\n'
// const int MAX;
// const int MOD;
int dp[105][105];
int s1[105],s2[105];
int val[6][6]={
    {0,0,0,0,0,0},
    {0,5,-1,-2,-1,-3},
    {0,-1,5,-3,-2,-4},
    {0,-2,-3,5,-2,-2},
    {0,-1,-2,-2,5,-1},
    {0,-3,-4,-2,-1,0},
};
int c2n(char c){
    if(c=='A')return 1;
    if(c=='C')return 2;
    if(c=='G')return 3;
    if(c=='T')return 4;
    return 0;
}
void solve(){
    int l1,l2;
    cin>>l1;
    for(int i=1;i<=l1;++i){
        char c;cin>>c;
        s1[i]=c2n(c);
    }
    cin>>l2;
    for(int i=1;i<=l2;++i){
        char c;cin>>c;
        s2[i]=c2n(c);
    }
    memset(dp,0xcf,sizeof dp);
    dp[0][0]=0;
    for(int i=1;i<=l1;++i){
        dp[i][0]=dp[i-1][0]+val[s1[i]][5];
    }
    for(int i=1;i<=l2;++i){
        dp[0][i]=dp[0][i-1]+val[s2[i]][5];
    }
    for(int i=1;i<=l1;i++) for(int j=1;j<=l2;j++){
        dp[i][j]=max(dp[i-1][j-1]+val[s1[i]][s2[j]],
        max(dp[i-1][j]+val[s1[i]][5],dp[i][j-1]+val[5][s2[j]]));
    }
    cout<<dp[l1][l2]<<endl;
}
signed main() {
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    // int times;cin>>times;
    // while(times--)
    solve();
    return 0;
}

posted @ 2025-05-15 23:01  Treow  阅读(29)  评论(1)    收藏  举报