题目的话,就是咱们高中经常做的涂色问题,一共三种颜色。
最直观的感觉:不就是dp吗,考虑左边和上面的元素不就行了。但这样完全是不行的,2*2的我还能做,但是3*3除了枚举我已经无法得出正确答案了。
这个题正确的做法是降维,因为有一个维度题目给的数据范围是 <= 5的,就针对这个处理。我们考虑一整行的状态转移,对于维度m,一行的可能性一共有 3 ∗ 2 m − 1 3*2^{m-1} 3∗2m−1种。
对每一行,我们可以用一个数字来存,因为只有5位,用10进制状态压缩即可。判断是否可转移,我们只需要判断每一位是否相等,都不相等说明可以从一行转移到另一行。
代码如下:
typedef long long ll;
class Solution {
vector<int> types;
public:
void dfs(int m, int ct, int last, int num)
{