洛谷4059找爸爸(Code+第一次月赛)

题目:https://www.luogu.org/problemnew/show/P4059

dp。

1.看出-A-B(k-1)可以理解成连续空格的第一个 -A,其余 -B;

2.把会干扰的“上一步右端是不是空格”加进参数里;

3.初始化!!!!!!!

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char ch;
int a[3005],b[3005],n,m,c[5][5],d[3005][3005][2][2],A,B;
int num(char chh)//A=65 T=84 G=71 C=67
{
    if(chh=='A')return 1;
    if(chh=='T')return 2;
    if(chh=='G')return 3;
    if(chh=='C')return 4;
}
int main()
{
    while(1)
    {
        scanf("%c",&ch);
        if(ch==' ')continue;
        if(ch=='
')break;
        a[++n]=num(ch);
    }
    while(1)
    {
        scanf("%c",&ch);
        if(ch==' ')continue;
        if(ch=='
')break;
        b[++m]=num(ch);
    }
    for(int i=1;i<=4;i++)
        for(int j=1;j<=4;j++)
            scanf("%d",&c[i][j]);
    scanf("%d%d",&A,&B);
    memset(d,-3,sizeof d);
    d[0][1][0][1]=-A;
    for(int i=2;i<=m;i++)
        d[0][i][0][1]=d[0][i-1][0][1]-B;
    d[1][0][1][0]=-A;
    for(int i=2;i<=n;i++)
        d[i][0][1][0]=d[i-1][0][1][0]-B;
    d[0][0][1][1]=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            d[i][j][1][1]=max(d[i-1][j-1][1][1],max(d[i-1][j-1][1][0],d[i-1][j-1][0][1]))+c[a[i]][b[j]];
            d[i][j][0][1]=max(d[i][j-1][0][1]-B,max(d[i][j-1][1][0]-A,d[i][j-1][1][1]-A));
            d[i][j][1][0]=max(d[i-1][j][1][0]-B,max(d[i-1][j][0][1]-A,d[i-1][j][1][1]-A));
        }
    int ans=max(d[n][m][1][1],max(d[n][m][1][0],d[n][m][0][1]));
    printf("%d",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/Narh/p/8470756.html