답안 #694101

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
694101 2023-02-03T19:11:43 Z rainboy Sandwich (JOI16_sandwich) C
0 / 100
2 ms 1620 KB
#include <stdio.h>
#include <string.h>

#define N	50
#define M	50
#define INF	0x3f3f3f3f

int min(int a, int b) { return a < b ? a : b; }
int max(int a, int b) { return a > b ? a : b; }

int kk[N + 1][M + 1];

int rect(int i1, int j1, int i2, int j2) {
	return kk[i2][j2] - kk[i2][j1] - kk[i1][j2] + kk[i1][j1];
}

int main() {
	static char cc[N][M + 1];
	static int dp[N + 1][M + 1][N + 1][M + 1], ans[N][M];
	int n, m, i, i1, i2, j, j1, j2;

	scanf("%d%d", &n, &m);
	for (i = 0; i < n; i++)
		scanf("%s", cc[i]);
	for (i = 0; i < n; i++)
		memset(ans[i], 0x3f, m * sizeof *ans[i]);
	for (i = 0; i < n; i++)
		for (j = 0; j < m; j++)
			kk[i + 1][j + 1] = cc[i][j] == 'N' ? 0 : 1;
	for (i = 1; i <= n; i++)
		for (j = 1; j <= m; j++)
			kk[i][j] += kk[i][j - 1];
	for (i = 1; i <= n; i++)
		for (j = 1; j <= m; j++)
			kk[i][j] += kk[i - 1][j];
	for (i1 = 0; i1 <= n; i1++)
		for (j1 = 0; j1 <= m; j1++)
			for (i2 = n; i2 >= i1; i2--)
				memset(dp[i1][j1][i2], 0x3f, (m + 1) * sizeof *dp[i1][j1][i2]);
	dp[0][0][n][m] = 0;
	for (i1 = 0; i1 < n; i1++)
		for (j1 = 0; j1 < m; j1++)
			for (i2 = n; i2 >= i1; i2--)
				for (j2 = m; j2 >= j1; j2--) {
					int x = dp[i1][j1][i2][j2];

					if (x == INF)
						continue;
					for (i = i1; i <= i2; i++)
						for (j = j1; j <= j2; j++) {
							int ul = rect(i1, j1, i, j) == (i - i1) * (j - j1);
							int ur = rect(i1, j, i, j2) == 0;
							int dl = rect(i, j1, i2, j) == 0;
							int dr = rect(i, j, i2, j2) == (i2 - i) * (j2 - j);

							if (ul && i1 < i && j1 < j)
								ans[i - 1][j - 1] = min(ans[i - 1][j - 1], (x + (i - i1) * (j - j1)) * 2);
							if (ur && i1 < i && j < j2)
								ans[i - 1][j] = min(ans[i - 1][j], (x + (i - i1) * (j2 - j)) * 2);
							if (dl && i < i2 && j1 < j)
								ans[i][j - 1] = min(ans[i][j - 1], (x + (i2 - i) * (j - j1)) * 2);
							if (dr && i < i2 && j < j2)
								ans[i][j] = min(ans[i][j], (x + (i2 - i) * (j2 - j)) * 2);
							if (ul && dr) {
								dp[i1][j][i][j2] = min(dp[i1][j][i][j2], x + (i - i1) * (j - j1) + (i2 - i) * (j2 - j));
								dp[i][j1][i2][j] = min(dp[i][j1][i2][j], x + (i - i1) * (j - j1) + (i2 - i) * (j2 - j));
							}
							if (ur && dl) {
								dp[i1][j1][i][j] = min(dp[i1][j1][i][j], x + (i - i1) * (j2 - j) + (i2 - i) * (j - j1));
								dp[i][j][i2][j2] = min(dp[i][j][i2][j2], x + (i - i1) * (j2 - j) + (i2 - i) * (j - j1));
							}
						}
				}
	for (i = 0; i < n; i++)
		for (j = 0; j < m; j++)
			printf("%d%c", ans[i][j] == INF ? -1 : ans[i][j], j + 1 < m ? ' ' : '\n');
	return 0;
}

Compilation message

sandwich.c: In function 'main':
sandwich.c:22:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   22 |  scanf("%d%d", &n, &m);
      |  ^~~~~~~~~~~~~~~~~~~~~
sandwich.c:24:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   24 |   scanf("%s", cc[i]);
      |   ^~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 672 KB Output is correct
3 Correct 2 ms 1236 KB Output is correct
4 Correct 1 ms 296 KB Output is correct
5 Incorrect 1 ms 1620 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 672 KB Output is correct
3 Correct 2 ms 1236 KB Output is correct
4 Correct 1 ms 296 KB Output is correct
5 Incorrect 1 ms 1620 KB Output isn't correct
6 Halted 0 ms 0 KB -