OpenJudge
这题OJ没有java提交选项,用c++写了
思路
待补充
Code
#include<iostream>
#include <algorithm>
#include<string.h>
using namespace std;
const int INF = 10000;
int W, H, M;
int record[25][25][25];
int recursion(int w, int h, int m);
int sv(int w, int h, int m) {
int s[25];
int ans = INF;
for (int i = 1; i <= w - 1; i++) {// 竖切宽度
int temp = INF;
for (int j = 0; j <= m - 1; j++) {// 分配切割次数
temp = min(temp, max(recursion(i, h, j), recursion(w - i, h, m - 1 - j)));
}
s[i] = temp;
ans = min(ans, s[i]);
}
return ans;
}
int sh(int w, int h, int m) {
int s[25];
int ans = INF;
for (int i = 1; i <= h - 1; i++) {// 横切宽度
int temp = INF;
for (int j = 0; j <= m - 1; j++) {// 分配切割次数
temp = min(temp, max(recursion(w, i, j), recursion(w, h - i, m - 1 - j)));
}
s[i] = temp;
ans = min(ans, s[i]);
}
return ans;
}
int recursion(int w, int h, int m) {
if (record[w][h][m] != -1)
return record[w][h][m];
if (w * h < m + 1)
return record[w][h][m] = INF;
if (m == 0)
return record[w][h][m] = w * h;
return record[w][h][m] = min(sv(w, h, m), sh(w, h, m));
}
int main() {
memset(record, -1, sizeof(record));
while (cin >> W >> H >> M) {
if (W == 0 && H == 0 && M == 0)
break;
int ans = recursion(W, H, M - 1);
cout << ans << endl;
}
return 0;
}