#P2032. Square Carpets

    ID: 1033 传统题 1000ms 256MiB 尝试: 1 已通过: 1 难度: 10 上传者: 标签>二维网格上的贪心算法或动态规划问题

Square Carpets

描述
Frugal先生买了一栋新房子。他深深地爱上了这栋新房子,因为里面有一个舒适的客厅,可以让他完全放松。他认为这栋新房子买得非常划算。
然而,让他失望的是,客厅的地板上有一些划痕。

地板呈矩形,由方形面板铺设而成。他想要将所有划痕面板更换为完好的面板,但他负担不起这笔费用。于是,他决定用地毯覆盖所有划痕面板。

他可以使用的地毯具有以下特点:

  • 地毯为正方形。
  • 地毯可以相互重叠。
  • 地毯不能折叠。
  • 提供不同尺寸的地毯,地毯的边长是面板边长的整数倍。

地毯必须覆盖所有划痕面板,但不能覆盖任何完好的面板。

例如,如果划痕面板如图11所示,则至少需要66块地毯。

11:示例覆盖

由于地毯的价格与其尺寸无关,Frugal先生希望尽可能减少使用的地毯数量。

你的任务是编写一个程序,计算覆盖所有划痕面板所需的最少地毯数量。

输入
输入包含多个数据集。输入以一行包含两个00的行表示结束。

数据集11
数据集22
...
数据集nn
00 00

每个数据集(DataSeti_i)表示地板的状态。数据集的格式如下:

WW HH
P11P_{11} P12P_{12} P13P_{13} ... P1WP_{1W}
P21P_{21} P22P_{22} P23P_{23} ... P2WP_{2W}
...
PH1P_{H1} PH2P_{H2} PH3P_{H3} ... PHWP_{HW}

其中,正整数WWHH分别表示客厅在xxyy方向上的面板数量。WWHH的值不超过1010。整数PyxP_{yx}表示面板的状态,其值为:

00:完好面板(不得覆盖),
11:划痕面板(必须覆盖)。

输出
对于每个数据集,你的程序应输出一行,包含一个整数,表示覆盖所有划痕面板所需的最少地毯数量。

样例输入

4 3
0 1 1 1
1 1 1 1
1 1 1 1
8 5
0 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 0 1 1 1 1
0 1 1 1 0 1 1 1
8 8
0 1 1 0 0 1 1 0
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
0 1 1 0 0 1 1 0
0 1 1 0 0 1 1 0
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
0 1 1 0 0 1 1 0
10 10
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 0 1 1 0 1 1 0 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 0 1 1 0 1 1 0 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 0 1 1 0 1 1 0 1
1 1 1 1 1 1 1 1 1 1
0 0

样例输出

2
6
14
29