萌新刚在上个平行宇宙学了dp,求助
查看原帖
萌新刚在上个平行宇宙学了dp,求助
127925
Kio_楼主2020/12/2 12:29

只拿了 40pt40 pt ...... 求dalao答疑 qwq

(附:希望有dalao能讲下为什么像题解那样的写法是正确的......,因为题目中有说两个字符串的长度必须相同,感觉直接dp的话考虑不到这一点......)

#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
using namespace std;
int n,m;
char s1[1020], s2[1020];
inline int change(char c){
    switch(c){
        case 'A' : return 1;
        case 'T' : return 2;
        case 'G' : return 3;
        case 'C' : return 4;
        //default : return 0;
    }
}
int d[5][5], A, B, f[1020][1020][3];
inline int max(int a,int b){return a>b?a:b;}
int read(){
    int num=0, f=1;
    char c=getchar();
    while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
    while('0'<=c&&c<='9')num=num*10+(c&15),c=getchar();
    return num*f;
}
int main(){
    //cin>>s1>>s2;
    //int lena = s1.size(), lenb = s2.size();
    scanf("%s",s1+1);
    scanf("%s",s2+1);
    int lena = strlen(s1+1),
        lenb = strlen(s2+1);

    for(int i=1;i<=4;i++) for(int j=1;j<=4;j++) d[i][j]=read();
    memset(f,-0x7f,sizeof(f));
    //f[0][0][1] = f[0][0][2] = -0x7fffffff;
    //printf("%d\n",f[0][0][1]);
    f[0][0][0]=0;
//  f[0][1][1]=-A;
//  f[1][0][2]=-A;
    A=read(), B=read();
    for(int i=0;i<=lena;i++){
        for(int j=0;j<=lenb;j++){
            if(i&&j)f[i][j][0] = max(f[i-1][j-1][0], max(f[i-1][j-1][1], f[i-1][j-1][2])) + d[change(s1[i])][change(s2[j])];
            if(i)f[i][j][1] = max(f[i-1][j][1] - B, max(f[i-1][j][0] - A, f[i-1][j][2] - A));
            if(j)f[i][j][2] = max(f[i][j-1][1] - A, max(f[i][j-1][0] - A, f[i][j-1][2] - B));
        }
    }
    printf("%d",max(f[lena][lenb][0], max(f[lena][lenb][1], f[lena][lenb][2])));
    return 0;
}

谢谢dalao!

2020/12/2 12:29
加载中...