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;
}

浙公网安备 33010602011771号