zoukankan      html  css  js  c++  java
  • 洛谷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;
    }
  • 相关阅读:
    WiFi热点
    计算器
    flask的使用
    Python logging
    串口
    C# 定时器
    C# 控件
    cookie 和 session
    文件
    Linux命令
  • 原文地址:https://www.cnblogs.com/Narh/p/8470756.html
Copyright © 2011-2022 走看看