# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
38285 | nibnalin | Retro (COCI17_retro) | C++14 | 500 ms | 171128 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
const int maxn = 305, maxl = 155, inf = int(1e5)+5;
const int xx[3] = {-1, -1, -1};
const int yy[3] = {-1, 0, 1};
int r, s, memoi[maxn][maxn][maxl];
pair<int, int> memo[maxn][maxn][maxl];
string A[maxn];
inline bool valid(int x, int y) { return (x >= -1 && y >= 0 && x < r && y < s); }
pair<int, int> DP(int x, int y, int diff)
{
if(x == -1) return {(diff?-inf:0), inf};
else if(diff < 0 || diff > r/2+1) return {-inf, inf};
if(A[x][y] == '*') return {(diff?-inf:0), inf};
else if(memo[x][y][diff].first != -1) return memo[x][y][diff];
else if(A[x][y] == '(' || A[x][y] == ')')
{
int c;
pair<int, int> res = {-inf, inf};
if(A[x][y] == '(') c = 1;
else c = -1;
for(int i = 0;i < 3;i++)
{
int u = x+xx[i], v = y+yy[i];
if(valid(u, v))
{
pair<int, int> tmp = DP(u, v, diff+c);
if(tmp.first > res.first) res = tmp, memoi[x][y][diff] = i;
else if(tmp.first == res.first && tmp.second < res.second) res = tmp, memoi[x][y][diff] = i;
}
}
//cout << x << " " << y << " " << diff << " " << c << " " << res.first << " " << res.second << "\n";
return memo[x][y][diff] = {res.first+1, A[x][y]};
}
else
{
pair<int, int> res = {-inf, inf};
for(int i = 0;i < 3;i++)
{
int u = x+xx[i], v = y+yy[i];
if(valid(u, v))
{
pair<int, int> tmp = DP(u, v, diff);
if(tmp.first > res.first) res = tmp, memoi[x][y][diff] = i;
else if(tmp.first == res.first && tmp.second < res.second) res = tmp, memoi[x][y][diff] = i;
}
}
//cout << x << " " << y << " " << diff << " " << res.first << " " << res.second << "\n";
return memo[x][y][diff] = res;
}
}
int main(void)
{
scanf("%d%d", &r, &s);
for(int i = 0;i < r;i++) cin >> A[i];
for(int i = 0;i < maxn;i++)
{
for(int j = 0;j < maxn;j++)
{
for(int k = 0;k < maxl;k++) memo[i][j][k] = {-1, -1}, memoi[i][j][k] = -1;
}
}
int start;
for(int i = 0;i < s;i++)
{
if(A[r-1][i] == 'M') start = i;
}
pair<int, int> res = DP(r-1, start, 0);
pair<int, int> cur = {r-1, start};
int diff = 0;
printf("%d\n", res.first);
while(cur.first != -1 && A[cur.first][cur.second] != '*')
{
int c = 0;
if(A[cur.first][cur.second] == '(') c = 1;
else if(A[cur.first][cur.second] == ')') c = -1;
int dir = memoi[cur.first][cur.second][diff];
pair<int, int> nex = {cur.first+xx[dir], cur.second+yy[dir]};
if(c != 0) printf("%c", A[cur.first][cur.second]);
cur = nex;
diff += c;
}
printf("\n");
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |