Submission #37975

#TimeUsernameProblemLanguageResultExecution timeMemory
37975nikhilRetro (COCI17_retro)C++14
40 / 100
276 ms62936 KiB
#include <bits/stdc++.h>
using namespace std ;

const int N = 302 ;
const int inf = 1e5 ;

int dp[N][N][170] ;
int grid[N][N] ;
int n, m ;
string expression ;

int solve(int i, int j, int open)
{
    if(open >= 160 or open < 0) return -inf ;
    if(i == 0 or grid[i][j] == 4)
    {
        if(open == 0) return 0;
        return -inf ;
    }
    if(dp[i][j][open] != -1) return dp[i][j][open] ;

    int ans = 0, now = 0, bracket = 0;

    if(grid[i-1][j] == 3) now = -1, bracket = 1 ;
    else if(grid[i-1][j] == 2) now = 1, bracket = 1 ;

    ans = bracket + solve(i-1, j, open + now) ;

    if(j > 0)
    {
        now = 0, bracket = 0;
        if(grid[i-1][j-1] == 3) now = -1, bracket = 1 ;
        else if(grid[i-1][j-1] == 2) now = 1, bracket = 1 ;
        ans = max(ans, bracket + solve(i-1, j-1, open + now)) ;
    }

    if(j < (m-1))
    {
        now = 0, bracket = 0;
        if(grid[i-1][j+1] == 3) now = -1, bracket = 1 ;
        else if(grid[i-1][j+1] == 2) now = 1, bracket = 1 ;
        ans = max(ans, bracket + solve(i-1, j+1, open + now)) ;
    }

    return dp[i][j][open] = ans ;
}

/*
int prepare(int i, int j, int open)
{
    if(open >= N/2 or open < 0) return -inf ;
    if(i == 0 or grid[i][j] == 4)
        return 0;
    if(dp[i][j][open] != -1) return dp[i][j][open] ;

    if(dp)


    int ans = 0, ans1 = -1, ans2 = -2, now = 0, bracket = 0;

    if(grid[i-1][j] == 3) now = -1, bracket = 1 ;
    else if(grid[i-1][j] == 2) now = 1, bracket = 1 ;

    ans1 = bracket + solve(i-1, j, open + now) ;

    if(j > 0)
    {
        now = 0, bracket = 0;
        if(grid[i-1][j-1] == 3) now = -1, bracket = 1 ;
        else if(grid[i-1][j-1] == 2) now = 1, bracket = 1 ;
        ans2 = bracket + solve(i-1, j-1, open + now) ;
    }

    if(j < (n-1))
    {
        now = 0, bracket = 0;
        if(grid[i-1][j+1] == 3) now = -1, bracket = 1 ;
        else if(grid[i-1][j+1] == 2) now = 1, bracket = 1 ;
        ans3 = bracket + solve(i-1, j+1, open + now) ;
    }

    if(ans1 > ans2 and ans1 > ans3)
    {
        if(grid[i-1][j] == 3) now = -1, expression += ')' ;
        else if(grid[i-1][j] == 2) now = 1, expression += '(' ;
        prepare(i-1, j, open + now);

    }
    else if(ans2 > ans3 and ans2 > ans1)
    {
        if(grid[i-1][j-1] == 3) now = -1, expression += ')' ;
        else if(grid[i-1][j-1] == 2) now = 1, expression += '(' ;
        prepare(i-1, j-1, open + now);

    }
    else if(ans3 > ans1 and ans3 > ans2)
    {
        if(grid[i-1][j+1] == 3) now = -1, expression += ')' ;
        else if(grid[i-1][j+1] == 2) now = 1, expression += '(' ;
        prepare(i-1, j+1, open + now);

    }
    else {
        int up = grid[i][j], upleft, upright ;
        if(ans1 == ans2 and ans2 == ans3)
        {
            upleft = grid[i][j-1], upright = grid[i][j+1] ;
            if(upleft == 2)
                prepare(i, j-1, 1 + open);
            if(upright == 2)
                prepare(i, j+1, 1 + open);
            if(up == 2)
                prepare(i, j+1, 1 + open);
        }
    }
}
*/


int main()
{
    cin >> n >> m ; char ch ; int si = n-1, sj = 0 ;
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < m; j++)
        {
            cin >> ch ;
            if(ch == '.')
                grid[i][j] = 1 ;
            if(ch == '(')
                grid[i][j] = 2 ;
            if(ch == ')')
                grid[i][j] = 3;
            if(ch == '*')
                grid[i][j] = 4 ;
            if(ch == 'M')
                grid[i][j] = 0, si = i, sj = j ;
        }
    }
    memset(dp, -1, sizeof(dp));
    cout << solve(si, sj, 0) << endl ;
    cout << "()()()" ;
    return 0;
}

/*
5 4
..).
.)(.
(.)*
*(.*
..M.

6 3
)(.
*..
(**
)()
().
M..

6 3
((.
*..
(**
)()
().
M..
*/
#Verdict Execution timeMemoryGrader output
Fetching results...