#include <iostream>
#include <algorithm>
#define inf 1<<30
using namespace std;
int ways[21][21][21];//ways[w][h][m],表示的是宽为w,高为h,切了m刀之后的,最大正方的最小面积
//而我们想要求的,就是 ways[w][h][m-1];
//边界条件是 w*h <= m,因为 w*h大小的面包是不能切m刀的,在这个条件下。
//m == 0,ways[w][h][0] = w*h;要切0刀,那么最大正方形的最小面积就是w*h,因为现在只有这一种可能
void origin(){
for (int w = 1;w <= 20;++w)
for (int h = 1;h <= 20;++h)
for (int m = 0;m <= 20;++m)
{
if (m==0)ways[w][h][0]=w*h;
else if (w*h < m+1)ways[w][h][m] = inf;
else ways[w][h][m] = 0;
}
}//用于初始化
int main(){
int W,H,M,S,T,SV,SH;//SV 表示,竖着切,最大面积的最小值;SH 表示,横着切,最大面积的最小值
origin();//将边界条件的第一个可能全部填满
while (cin>>W>>H>>M&&W){
for (int w = 1;w <= W;++w)
for (int h = 1;h <= H;++h)
for (int m = 1;m <= M-1;++m){
SH=T=SV=S=inf;
//SV = min{Si, i= 1,2,...,w-1};
//SH = min{Ti, i= 1,2,...,h-1};//这里两者的i都表示左边(或者是上面)那个矩形的对应的宽度(或者高度)
//Si : i表示左边那个要挨i刀,然后 返回 = 最大矩形的最小面积
for (int i=1;i<=w-1;++i){//这样对应每个都有一个i
for (int k = 0;k <= m-1;++k)
{
S = min(S,max(ways[i][h][k],ways[w-i][h][m-1-k]));
}
SV = min(SV,S);
}
for (int i=1;i<=h-1;++i){//这样对应每个都有一个i
for (int k = 0;k <= m-1;++k)
{
T = min(T,max(ways[w][i][k],ways[w][h-i][m-1-k]));
}
SH = min(SH,T);
}
ways[w][h][m] = min(SV,SH);
}
cout << ways[W][H][M-1]<<endl;
}
}
按照郭老师的思路打的码,非常好玩!学到了!