力扣每日一题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;

}

}

相关推荐
她的男孩6 分钟前
多租户和数据权限怎么共存?扒完拦截器注册链路,我找到 4 个隐蔽的坑
java·后端·架构
wordbaby30 分钟前
混合检索:两全其美的艺术
人工智能·算法
小溪学编程31 分钟前
Java BufferedReader 详解:从基础用法到性能优化
java·python·性能优化
彧azz1 小时前
数据结构:关于图的学习
c语言·数据结构·笔记·学习·算法
HZero.chen1 小时前
Java 匿名类简介
java·匿名类
热心网友俣先生1 小时前
A题-药材的烘干问题-题意逐句翻译
算法·数学建模
用户3126874877201 小时前
Java 泛型擦除到底擦掉了什么?类型安全与桥接方法深度拆解
java
2601_960356381 小时前
2026秋招运营分析师能力模型:SQL、指标体系、AIGC与业务分析
算法
暖焰核心1 小时前
继承全解——继承、默认成员函数、切片、隐藏与虚继承
java·前端·javascript
hetao17338371 小时前
校内场-提高组 ZYZSC-S-Round 4
c++·算法