Submission #18699

#TimeUsernameProblemLanguageResultExecution timeMemory
18699pichuliaL 모양의 종이 자르기 (KOI15_cut)C++98
25 / 25
156 ms34116 KiB
#include<stdio.h>
#include<algorithm>
using namespace std;
bool r[51][51][51][51];
int x[51][51][51][51];
int dp(int a, int b, int c, int d)
{
	if (r[a][b][c][d]) return x[a][b][c][d];
	r[a][b][c][d] = true;
	int res = 199999999;
	int i, j;

	if (c * d == 0)
	{
		if(a==b)return x[a][b][c][d] = 1;

		for (i = 1; i <= a/2; i++)
		{
			int cur = dp(i, b, 0, 0) + dp(a - i, b, 0, 0);
			res = min(res, cur);
		}
		for (i = 1; i <= b / 2; i++)
		{
			int cur = dp(a, i, 0, 0) + dp(a, b-i, 0, 0);
			res = min(res, cur);
		}
		return x[a][b][c][d] = res;
	}

	for (i = 1; i < a - c; i++)
	{
		int cur = dp(i, b, 0, 0) + dp(a - i, b, c, d);
		res = min(res, cur);
	}
	res = min(res, dp(a - c, b, 0, 0) + dp(c, b - d, 0, 0));
	for (i = a - c + 1; i < a; i++)
	{
		int cur = dp(i, b, i-(a-c), d) + dp(a - i, b-d, 0, 0);
		res = min(res, cur);
	}

	for (i = 1; i < b - d; i++)
	{
		int cur = dp(a, i, 0, 0) + dp(a, b - i, c, d);
		res = min(res, cur);
	}
	res = min(res, dp(a, b - d, 0, 0) + dp(a - c, d, 0, 0));
	for (i = b - d + 1; i < b; i++)
	{
		int cur = dp(a, i, c, i - (b - d)) + dp(a - c, b - i, 0, 0);
		res = min(res, cur);
	}

	return x[a][b][c][d] = res;
}
int main()
{
	int a, b, c, d;
	scanf("%d %d %d %d", &a, &b, &c, &d);
	printf("%d\n", dp(a, b, c, d));
}
#Verdict Execution timeMemoryGrader output
Fetching results...