力扣每日一题5-18

class Solution {

public int colorTheGrid(int m, int n) {

// 每一列可能的状态总数 每个单元有3可能

int totalState = 1;

for (int i = 0; i < m; ++i) totalState *= 3;

// pre[k] 代表前一轮dp 状态为k 的方案总数

int [] pre = new int [totalState];

// 初始化合法填色 的 方案数为1

for (int state = 0; state < totalState; ++state) {

if (checkCol(state, m)) pre[state] = 1;

}

for (int i = 1; i < n; ++i) {

int [] cur = new int [totalState];

// 枚举可能的转移

for (int preState = 0; preState < totalState; ++preState) {

if (pre[preState] == 0) continue;

for (int curState = 0; curState < totalState; ++curState) {

// 行和列的填色都满足题设

if (checkCol(curState, m) && checkRow(preState, curState, m)) {

cur[curState] = addWithMode(cur[curState], pre[preState]);

}

}

}

pre = cur;

}

int planNum = 0;

for (int state = 0; state < totalState; ++state) {

planNum = addWithMode(planNum, pre[state]);

}

return planNum;

}

private boolean checkCol(int state, int m) {

int prevCeilColor = -1;

while (m-- > 0) {

if (state % 3 == prevCeilColor) {

return false;

}

prevCeilColor = state % 3;

state /= 3;

}

return true;

}

private boolean checkRow(int pre, int cur, int m) {

while (m-- > 0) {

if (pre % 3 == cur % 3) return false;

pre /= 3;

cur /= 3;

}

return true;

}

private int addWithMode(int a, int b) {

int mode = (int) 1E9 + 7;

return (a + b) % mode;

}

}

相关推荐
2401_8414956421 小时前
【数据结构】红黑树的基本操作
java·数据结构·c++·python·算法·红黑树·二叉搜索树
西猫雷婶21 小时前
random.shuffle()函数随机打乱数据
开发语言·pytorch·python·学习·算法·线性回归·numpy
学编程的小鬼21 小时前
SpringBoot 自动装配原理剖析
java·spring boot·后端
小李独爱秋21 小时前
机器学习中的聚类理论与K-means算法详解
人工智能·算法·机器学习·支持向量机·kmeans·聚类
@@神农1 天前
maven的概述以及在mac安装配置
java·macos·maven
杜子不疼.1 天前
【C++】玩转模板:进阶之路
java·开发语言·c++
夜晚中的人海1 天前
【C++】异常介绍
android·java·c++
Le1Yu1 天前
2025-9-28学习笔记
java·笔记·学习
小欣加油1 天前
leetcode 1863 找出所有子集的异或总和再求和
c++·算法·leetcode·职场和发展·深度优先
C++chaofan1 天前
项目中为AI添加对话记忆
java·数据结构·人工智能·redis·缓存·个人开发·caffeine