观察数据范围,发现 \(nm \le 50\) 这个条件有蹊跷。
根据 \(m \le n\) 可得 \(m \le \sqrt{50}\) 即 \(m \le 7\)。
于是考虑状压。
发现这个题跟其他题有点区别。
转移要同时考虑上下两行。
考虑设 \(f_{i,j,k}\) 表示转移到前 \(i - 1\) 行的状态都合法,第 \(i\) 行的状态为 \(j\),第 \(i - 1\) 行的状态为 \(k\) 的最小价值。
那么转移就比较显然了。
枚举行数、最近三行的状态,考虑三行中间那行是否合法并转移。
还有一点需要注意,答案的状态为 \(f_{n+1,0,x}\) 而非 \(f_{n,x,y}\)。
因为根据定义,后者只考虑了 \(n - 1\) 行的状态。
然鹅题目还要求最小的油库个数,简单地再开一个 \(g\) 数组在转移的同时更新即可。
可以预处理 \(cost_{i,j}\) 表示第 \(i\) 行状态为 \(j\) 的花费。
代码:
1 |
|