题目描述
由于小毛同学智商不高,理解不了真正的一笔画问题,于是他就开始研究一种变形的一笔画问题。给出 n 行
m 列的点阵,每个点是一个字符: “.” 或 “#” ,其中“#”表示该点是障碍物。现在小毛的问题是: 他最少要画多少笔才能把点阵里所有的“.”都覆盖完毕(被小毛画到的点就会被覆盖)。小毛的笔有点奇怪:小毛每次只能在某一行或某一列画,小毛当然想一笔就把某一行或某一列画完,但很遗憾,在任何时候都不允许小毛画的那一段点阵含有障碍物。还有一点更奇怪: 已经被画过的点,不能重复被画。
输入格式 1779.in
第一行: n ,
m 表示点阵行数和列数 。 0<n,m≤10
接下来有 n 行, 每行有m 个字符,“.” 或 “#”
输出格式 1779.out
一个整数, 小毛最少要画多少笔。
输入样例 1779.in
输出样例一:
2 4
.##.
….
输出样例二:
3 4
….
….
….
输出样例 1779.out
输出样例一:
3
输出样例二:
3
这题实在是很考验思维能力,“透过现象看本质”。
最初我是完全没有考虑到 DP 的做法,而是采用了贪心策略,每次取当前可以填充最多格子的一笔来画,可以得到 75 分。然而,后面无论怎样调整贪心策略,始终不能得到更高的分数。这表明贪心策略确实是不可行的。
讲评的时候,我才意识到,这题与铺地砖一题有相似之处。但是又有种植玉米的特点,即自身会有一部分限制。而且本题求的不是方案数,而是最少步数。
那么我们不妨设 f[i][state] 表示把前 i 行填满,其中第