• BZOJ 1806 DP


    思路:
    f[i][a][b][c][d]
    表示在第i天 昨天1矿吃的是a 前天1矿吃的是b
    昨天2矿吃的是c 前天2矿吃的是d
    的最优解

    暴力转移
    哦 需要优化一下空间… 变成i%2 就好了

    //By SiriusRen
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int N=100050; 
    int n,f[2][4][4][4][4],ans;
    char ch[N];
    int cmp(int a,int b,int c){
        bool vis[4];
        memset(vis,0,sizeof(vis));
        vis[a]=vis[b]=vis[c]=1;
        return vis[1]+vis[2]+vis[3];
    }
    int main(){
        scanf("%d%s",&n,ch);
        for(int i=0;i<n;i++)
            if(ch[i]=='M')ch[i]=1;
            else if(ch[i]=='F')ch[i]=2;
            else ch[i]=3;
        memset(f,-1,sizeof(f));
        f[0][0][0][0][0]=0;
        for(int i=0;i<n;i++)for(int a=0;a<=3;a++)
        for(int b=0;b<=3;b++)for(int c=0;c<=3;c++)
        for(int d=0;d<=3;d++)if(~f[i&1][a][b][c][d]){
            int add1=cmp(a,b,ch[i]),add2=cmp(c,d,ch[i]);
            f[!(i&1)][ch[i]][a][c][d]=max(f[!(i&1)][ch[i]][a][c][d],f[i&1][a][b][c][d]+add1);
            f[!(i&1)][a][b][ch[i]][c]=max(f[!(i&1)][a][b][ch[i]][c],f[i&1][a][b][c][d]+add2);
            if(i==n-1)ans=max(ans,max(f[!(i&1)][ch[i]][a][c][d],f[!(i&1)][a][b][ch[i]][c]));
        }
        printf("%d
    ",ans);
    }

    这里写图片描述

  • 相关阅读:
    https://github.com/cykl/infoqscraper/
    C# 笔记
    json.org
    python html parse
    doxygen
    review board
    ruunlevel debian
    连接REDIS
    composer
    php需要注意的地方
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6532050.html
Copyright © 2020-2023  润新知