[]分面包问题

#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;
	}
}


按照郭老师的思路打的码,非常好玩!学到了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值