0
点赞
收藏
分享

微信扫一扫

2022牛客寒假算法基础集训营1

龙毓七七 2022-02-13 阅读 39

K.冒险公社

简化题意

给你一个字符串 A A A A i A_i Ai 表示 a i − 2 , a i − 1 , a i a_{i-2},a_{i-1},a_i ai2,ai1,ai的颜色组合情况

A i A_i Ai颜色组合
R R R R > G R>G R>G
G G G R < G R<G R<G
B B B R = G R=G R=G

求在给定的罗盘预测颜色字符串sta的情况下,原岛屿的颜色组合中,绿色最多的那种情况下的绿色数量为多少

思路

因为对于一个预测 s t a i sta_i stai决定了 a i − 2 , a i − 1 , a i a_{i-2},a_{i-1},a_i ai2,ai1,ai的颜色组合情况, s t a i + 1 sta_{i + 1} stai+1决定了 a i − 1 , a i , a i + 1 a_{i-1},a_{i},a_{i+1} ai1,ai,ai+1的颜色组合情况,从状态 s t a i sta_i stai转移到 s t a i + 1 sta_{i + 1} stai+1 s t a i + 1 sta_{i + 1} stai+1复用了 a i − 1 , a i a_{i-1},a_i ai1,ai,而 a i − 2 a_{i-2} ai2对于 s t a i + 1 sta_{i + 1} stai+1是没有影响的,所以我们只需要在满足 s t a i sta_i stai的所有{a}的情况下,枚举 a i + 1 a_{i+1} ai+1,判断{{a}+ a i + 1 a_{i+1} ai+1}是否合法。

转移方程:
d p [ i ] [ c 2 ] [ c 3 ] [ c 4 ] = m a x ( t h i s , d p [ i − 1 ] [ c 1 ] [ c 2 ] [ c 3 ] ) dp[i][c2][c3][c4]=max(this,dp[i-1][c1][c2][c3]) dp[i][c2][c3][c4]=max(this,dp[i1][c1][c2][c3])

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e5 + 10;
int dp[maxn][3][3][3];
void add(vector<int> vt, int vis, int &res){
    for(auto &te: vt) if(te == vis) res++;
    return;
}
void max(int &x, int y){
    if(x < y)
        x = y;
    return;
}
int main(){
    int n; cin >> n;
    string sta; cin >> sta;
    memset(dp, -1, sizeof dp);
    for(int i = 0; i < 3; i++){
        for(int j = 0; j < 3; j++){
            for(int z = 0; z < 3; z++){
                int R = 0, G = 0, B = 0;
                add({i, j, z}, 0, G);
                add({i, j, z}, 1, R);
                add({i, j, z}, 2, B);
                if(sta[2] == 'G' && G > R || sta[2] == 'R' && R > G || sta[2] == 'B' && R == G){
                    dp[2][i][j][z] = G;
                }
            }
        }
    }

    for(int index = 3; index < n; index++){
        for(int i = 0; i < 3; i++){
            for(int j = 0; j < 3; j++){
                for(int z = 0; z < 3; z++){
                    if(dp[index - 1][i][j][z] == -1) continue;
                    for(int k = 0; k < 3; k++){
                        int R = 0, G = 0, B = 0;
                        add({j, z, k},0, G);
                        add({j, z, k}, 1, R);
                        add({j, z, k}, 2, B);
                        if(sta[index] == 'G' && G > R){
                            max(dp[index][j][z][k], dp[index - 1][i][j][z] + (k == 0));
                        }
                        if(sta[index] == 'R' && R > G){
                            max(dp[index][j][z][k], dp[index - 1][i][j][z] + (k == 0));
                        }
                        if(sta[index] == 'B' && R == G){
                            max(dp[index][j][z][k], dp[index - 1][i][j][z] + (k == 0));
                        }
                    }
                }
            }
        }
    }
    int res = -1;
    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
            for(int z = 0; z < 3; z++)
                max(res, dp[n - 1][i][j][z]);

    cout << res;
}
举报

相关推荐

0 条评论