Submission #1170045

#TimeUsernameProblemLanguageResultExecution timeMemory
1170045AlgorithmWarriorDango Maker (JOI18_dango_maker)C++20
100 / 100
470 ms115056 KiB
#include <bits/stdc++.h>

using namespace std;

int const INF=1e9;
int const MAX=3005;
int dp[MAX][MAX][3];
int n,m;
char mat[MAX][MAX];

void read(){
    cin>>n>>m;
    int i,j;
    for(i=1;i<=n;++i)
        for(j=1;j<=m;++j)
            cin>>mat[i][j];
}

bool ok1(int lin,int col){
    if(mat[lin][col]!='R')
        return 0;
    if(mat[lin][col+1]!='G')
        return 0;
    if(mat[lin][col+2]!='W')
        return 0;
    return 1;
}

bool ok2(int lin,int col){
    if(mat[lin][col]!='R')
        return 0;
    if(mat[lin+1][col]!='G')
        return 0;
    if(mat[lin+2][col]!='W')
        return 0;
    return 1;
}

bool inside(int lin,int col){
    return 0<lin && lin<=n && 0<col && col<=m;
}

void maxself(int& x,int val){
    if(x<val)
        x=val;
}

int solve_diag(int diag){
    int lin=1,col=diag;
    while(!inside(lin,col)){
        ++lin;
        --col;
    }
    dp[lin-1][col+1][1]=-INF;
    dp[lin-1][col+1][2]=-INF;
    while(inside(lin,col)){
        maxself(dp[lin][col][0],dp[lin-1][col+1][0]);
        maxself(dp[lin][col][0],dp[lin-1][col+1][1]);
        maxself(dp[lin][col][0],dp[lin-1][col+1][2]);
        if(ok1(lin,col)){
            maxself(dp[lin][col][1],1+dp[lin-1][col+1][1]);
            if(inside(lin-1,col+1)){
                maxself(dp[lin][col][1],1+dp[lin-2][col+2][0]);
                maxself(dp[lin][col][1],1+dp[lin-2][col+2][1]);
            }
            else
                maxself(dp[lin][col][1],1+dp[lin-1][col+1][0]);
        }
        else
            dp[lin][col][1]=-INF;
        if(ok2(lin,col)){
            maxself(dp[lin][col][2],1+dp[lin-1][col+1][0]);
            maxself(dp[lin][col][2],1+dp[lin-1][col+1][1]);
            maxself(dp[lin][col][2],1+dp[lin-1][col+1][2]);
        }
        else
            dp[lin][col][2]=-INF;
        ++lin;
        --col;
    }
    --lin;
    ++col;
    int ans=0;
    maxself(ans,dp[lin][col][0]);
    maxself(ans,dp[lin][col][1]);
    maxself(ans,dp[lin][col][2]);
    return ans;
}

int solve(){
    int i;
    int sum=0;
    for(i=1;i<=n+m-1;++i)
        sum+=solve_diag(i);
    return sum;
}

int main()
{
    read();
    cout<<solve();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...