답안 #236079

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
236079 2020-05-31T07:10:43 Z NONAME Retro (COCI17_retro) C++17
40 / 100
143 ms 109176 KB
#include <bits/stdc++.h>
#define all(x) x.begin(), x.end()
#define sz(x) int(x.size())
#define in(x) freopen(x, "r", stdin)
#define out(x) freopen(x, "w", stdout)
#define N 100500
#define oo ll(1e16)
#define ft first
#define sd second
#define pb push_back
#define ppb pop_back
#define el '\n'
#define elf endl
#define base ll(1e9 + 7)
using namespace std;

typedef long long ll;
typedef long double ld;

int n, m, f[300][300][300];
string s[N];

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    cin >> n >> m;
    for (int i = 0; i < n; i++)
		cin >> s[i];

	for (int i = 0; i < n - i - 1; i++)
		swap(s[i], s[n - i - 1]);

	for (int i = 0; i < n; i++)
	for (int j = 0; j < m; j++)
	for (int k = 0; k < n; k++)
		f[i][j][k] = -1;
    for (int i = 0; i < n - 1; i++)
	for (int j = 0; j < m; j++)
        if (i == 0) {
			if (s[i][j] == 'M') {
				f[i][j][0] = 0;
                if (j - 1 >= 0 && s[i + 1][j - 1] != '*') {
					if (s[i + 1][j - 1] == '.') {
						for (int k = 0; k < n; k++)
							if (f[i][j][k] != -1)
								f[i + 1][j - 1][k] = max(f[i + 1][j - 1][k], f[i][j][k]);
					} else {
						if (s[i + 1][j - 1] == '(') {
							for (int k = 0; k < n; k++)
								if (f[i][j][k] != -1)
									f[i + 1][j - 1][k + 1] = max(f[i + 1][j - 1][k + 1], f[i][j][k] + 1);
						} else {
                            for (int k = 1; k < n; k++)
								if (f[i][j][k] != -1)
									f[i + 1][j - 1][k - 1] = max(f[i + 1][j - 1][k - 1], f[i][j][k] + 1);
						}
					}
                }
                if (s[i + 1][j] != '*') {
					if (s[i + 1][j] == '.') {
						for (int k = 0; k < n; k++)
							if (f[i][j][k] != -1)
								f[i + 1][j][k] = max(f[i + 1][j][k], f[i][j][k]);
					} else {
						if (s[i + 1][j] == '(') {
							for (int k = 0; k < n; k++)
								if (f[i][j][k] != -1)
									f[i + 1][j][k + 1] = max(f[i + 1][j][k + 1], f[i][j][k] + 1);
						} else {
                            for (int k = 1; k < n; k++)
								if (f[i][j][k] != -1)
									f[i + 1][j][k - 1] = max(f[i + 1][j][k - 1], f[i][j][k] + 1);
						}
					}
                }
                if (j + 1 < m && s[i + 1][j + 1] != '*') {
					if (s[i + 1][j + 1] == '.') {
						for (int k = 0; k < n; k++)
							if (f[i][j][k] != -1)
								f[i + 1][j + 1][k] = max(f[i + 1][j + 1][k], f[i][j][k]);
					} else {
						if (s[i + 1][j + 1] == '(') {
							for (int k = 0; k < n; k++)
								if (f[i][j][k] != -1)
									f[i + 1][j + 1][k + 1] = max(f[i + 1][j + 1][k + 1], f[i][j][k] + 1);
						} else {
                            for (int k = 1; k < n; k++)
								if (f[i][j][k] != -1)
									f[i + 1][j + 1][k - 1] = max(f[i + 1][j + 1][k - 1], f[i][j][k] + 1);
						}
					}
                }
			}
        } else {
			if (j - 1 >= 0 && s[i + 1][j - 1] != '*') {
				if (s[i + 1][j - 1] == '.') {
					for (int k = 0; k < n; k++)
						if (f[i][j][k] != -1)
							f[i + 1][j - 1][k] = max(f[i + 1][j - 1][k], f[i][j][k]);
				} else {
					if (s[i + 1][j - 1] == '(') {
						for (int k = 0; k < n; k++)
							if (f[i][j][k] != -1)
								f[i + 1][j - 1][k + 1] = max(f[i + 1][j - 1][k + 1], f[i][j][k] + 1);
					} else {
						for (int k = 1; k < n; k++)
							if (f[i][j][k] != -1)
								f[i + 1][j - 1][k - 1] = max(f[i + 1][j - 1][k - 1], f[i][j][k] + 1);
					}
				}
			}
			if (s[i + 1][j] != '*') {
				if (s[i + 1][j] == '.') {
					for (int k = 0; k < n; k++)
						if (f[i][j][k] != -1)
							f[i + 1][j][k] = max(f[i + 1][j][k], f[i][j][k]);
				} else {
					if (s[i + 1][j] == '(') {
						for (int k = 0; k < n; k++)
							if (f[i][j][k] != -1)
								f[i + 1][j][k + 1] = max(f[i + 1][j][k + 1], f[i][j][k] + 1);
					} else {
						for (int k = 1; k < n; k++)
							if (f[i][j][k] != -1)
								f[i + 1][j][k - 1] = max(f[i + 1][j][k - 1], f[i][j][k] + 1);
					}
				}
			}
			if (j + 1 < m && s[i + 1][j + 1] != '*') {
				if (s[i + 1][j + 1] == '.') {
					for (int k = 0; k < n; k++)
						if (f[i][j][k] != -1)
							f[i + 1][j + 1][k] = max(f[i + 1][j + 1][k], f[i][j][k]);
				} else {
					if (s[i + 1][j + 1] == '(') {
						for (int k = 0; k < n; k++)
							if (f[i][j][k] != -1)
								f[i + 1][j + 1][k + 1] = max(f[i + 1][j + 1][k + 1], f[i][j][k] + 1);
					} else {
						for (int k = 1; k < n; k++)
							if (f[i][j][k] != -1)
								f[i + 1][j + 1][k - 1] = max(f[i + 1][j + 1][k - 1], f[i][j][k] + 1);
					}
				}
			}
		}

    int mx = 0;
    for (int i = 0; i < n; i++)
	for (int j = 0; j < m; j++)
		mx = max(mx, f[i][j][0]);

	cout << mx << el;
	cout << "()";
}

Compilation message

retro.cpp: In function 'int main()':
retro.cpp:149:5: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
     for (int i = 0; i < n; i++)
     ^~~
retro.cpp:153:2: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
  cout << mx << el;
  ^~~~
# 결과 실행 시간 메모리 Grader output
1 Partially correct 6 ms 3584 KB Partially correct
2 Partially correct 6 ms 3840 KB Partially correct
3 Partially correct 6 ms 3712 KB Partially correct
4 Partially correct 8 ms 3968 KB Partially correct
5 Partially correct 7 ms 5248 KB Partially correct
6 Partially correct 10 ms 9216 KB Partially correct
7 Partially correct 14 ms 12160 KB Partially correct
8 Partially correct 9 ms 7680 KB Partially correct
9 Partially correct 14 ms 12288 KB Partially correct
10 Partially correct 16 ms 15616 KB Partially correct
11 Partially correct 131 ms 102624 KB Partially correct
12 Partially correct 118 ms 102624 KB Partially correct
13 Partially correct 60 ms 47488 KB Partially correct
14 Partially correct 58 ms 47488 KB Partially correct
15 Partially correct 143 ms 108952 KB Partially correct
16 Partially correct 134 ms 108948 KB Partially correct
17 Partially correct 121 ms 92956 KB Partially correct
18 Partially correct 112 ms 92792 KB Partially correct
19 Partially correct 142 ms 109176 KB Partially correct
20 Partially correct 133 ms 109176 KB Partially correct