力扣每日一题5-18

class Solution {

public int colorTheGrid(int m, int n) {

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

int totalState = 1;

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

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

int \[\] pre = new int totalState;

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

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

if (checkCol(state, m)) prestate = 1;

}

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

int \[\] cur = new int totalState;

// 枚举可能的转移

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

if (prepreState == 0) continue;

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

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

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

curcurState = addWithMode(curcurState, prepreState);

}

}

}

pre = cur;

}

int planNum = 0;

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

planNum = addWithMode(planNum, prestate);

}

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;

}

}

相关推荐
Sirens.2 小时前
Java并发锁详解:六类锁策略与 synchronized 底层原理
java·前端·算法
和裕3 小时前
全纸结构重型纸箱能否满足 1 吨以上设备出口熏蒸豁免要求?通关合规性全解析
大数据·运维·网络·人工智能·算法
sunshine22 girl3 小时前
Java学习五 面向对象高级5 内部类1
java·学习
tangguofeng3 小时前
不带头结点的链队操作集(不含InitFlag)(C语言版)
算法
苏打豆4 小时前
CRISP源码阅读——基于ROS2力矩反馈控制器与速度加速度零空间
c++·线性代数·算法·矩阵·机器人
用户1305180712154 小时前
JDBC学习DAY2:从Statement到PreparedStatement
java
蛋蛋的就会顺顺的5 小时前
hot100——矩阵
java·数据结构·算法·leetcode·力扣
老歌老听老掉牙5 小时前
麻花钻切屑形态演变的力学机制与临界条件分析
python·算法·钻头
周杰偷奶茶5 小时前
【Java】数组的定义和使用(附管理系统实战案例)
java·开发语言
zhangfeng11336 小时前
国产GPU/AI算力芯片现状(修订完整版 · 截至2026年9月
人工智能·算法·ai编程·npu