Submission #77363

#TimeUsernameProblemLanguageResultExecution timeMemory
77363Charis02Dango Maker (JOI18_dango_maker)C++14
100 / 100
398 ms113476 KiB
#include<iostream>
#include<stdio.h>
#include<vector>
#include<cmath>
#include<queue>
#include<string.h>
#include<map>
#include<set>
#include<algorithm>
#define ll long long
#define pi pair < ll,ll >
#define mp(a,b) make_pair(a,b)
#define rep(i,a,b) for(int i = a;i < b;i++)
#define N 3004
#define INF 1e9+7

using namespace std;

ll n,m,ans;
char ar[N][N];
ll dp[N][3]; // dp[.][1] = chose up in last row

bool can(pi r,pi g,pi w)
{
    if(w.first < 0 || w.first >= n || w.second < 0 || w.second >= m)
        return false;

    return (ar[r.first][r.second] == 'R' && ar[g.first][g.second] == 'G' && ar[w.first][w.second] == 'W');
}

int main()
{
    ios_base::sync_with_stdio(false);

    cin >> n >> m;

    rep(i,0,n)
    {
        rep(j,0,m)
        {
            cin >> ar[i][j];
        }
    }

    rep(s,0,n+m-1)
    {
        memset(dp,0,sizeof dp);

        ll j = min(m-1,(ll)s);
        ll i = s - j;

        dp[i][0] = 0;

        if(can(mp(i-1,j),mp(i,j),mp(i+1,j)))
        {
            dp[i][1] = 1;
        }

        if(can(mp(i,j-1),mp(i,j),mp(i,j+1)))
        {
            dp[i][2] = 1;
        }

        i++;
        j--;

        while(i <= s && j >= 0)
        {
            dp[i][0] = max(dp[i-1][1],dp[i-1][2]);
            dp[i][1] = max(dp[i-1][0],dp[i-1][1]) + (ll)(can(mp(i-1,j),mp(i,j),mp(i+1,j)));
            dp[i][2] = max(dp[i-1][0],dp[i-1][2]) + (ll)(can(mp(i,j-1),mp(i,j),mp(i,j+1)));

            i++;
            j--;
        }

        i--;
        j++;

        ans += max(dp[i][0],max(dp[i][1],dp[i][2]));
    }

    cout << ans << endl;

    return 0;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...