[SWEA] 벌꿀채취

Date:

[SWEA] 벌꿀채취

Problem URL : 벌꿀채취

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

int map[10][10];
int d[10][10];
int n, m, c;

// 벌통이 겹치지 않게 고를 수 있는 모든 경우의 수 고려
int getMaxPrice() {
	int ans = 0;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			for (int k = j + m; k <= n - m; k++) {
				ans = max(ans, d[i][j] + d[i][k]);
			}

			for (int a = i + 1; a < n; a++) {
				for (int b = 0; b < n; b++) {
					ans = max(ans, d[i][j] + d[a][b]);
				}
			}
		}
	}
	return ans;
}

// 해당 좌표(i,j)에서 얻을 수 있는 최대값을 재귀적으로 계산
int calc(int i, int j, int x, int sum, int val) {
	if (sum > c) {
		return 0;
	}
	if (x == m) {
		return val;
	}
	return max(calc(i, j + 1, x + 1, sum + map[i][j], val + map[i][j] * map[i][j]), calc(i, j + 1, x + 1, sum, val));
}

int main() {
	int TC;
	scanf("%d", &TC);

	for (int tc = 1; tc <= TC; tc++) {
		scanf("%d %d %d", &n, &m, &c);
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				scanf("%d", &map[i][j]);
				d[i][j] = 0;
			}
		}
		// M개의 연속된 벌통을 좌표(i,j)마다 선택한 것을 계산
		for (int i = 0; i < n; i++) {
			for (int j = 0; j <= n - m; j++) {
				d[i][j] = calc(i, j, 0, 0, 0);
			}
		}
		printf("#%d %d\n", tc, getMaxPrice());
	}
	return 0;
}

댓글