【C++动态规划】1411. 给 N x 3 网格图涂色的方案数|1844

【C++动态规划】1411. 给 N x 3 网格图涂色的方案数|1844

本文涉及知识点

C++动态规划

LeetCode1411. 给 N x 3 网格图涂色的方案数

提示
你有一个 n x 3 的网格图 grid ,你需要用 红,黄,绿 三种颜色之一给每一个格子上色,且确保相邻格子颜色不同(也就是有相同水平边或者垂直边的格子颜色不同)。
给你网格图的行数 n 。
请你返回给 grid 涂色的方案数。由于答案可能会非常大,请你返回答案对 10^9 + 7 取余的结果。
示例 1:

在这里插入图片描述


输入:n = 1
输出:12
解释:总共有 12 种可行的方法:
示例 2:
输入:n = 2
输出:54
示例 3:
输入:n = 3
输出:246
示例 4:
输入:n = 7
输出:106494
示例 5:
输入:n = 5000
输出:30228214
提示:
n == grid.length
grid[i].length == 3
1 <= n <= 5000

动态规划

v[i] 记录一行颜色的方案,如:{0,1,2}表示一行第一列是红色,第二列是黄色,第三列是绿色。
v的下标就是此方案的编号。M = v.size()
neiBo[i]记录所有可以和方案i相邻的行方案编号。

动态规划的状态表示

dp[i][j]记录第i行,最后一行方案为j的方案数。

动态规划的填报顺序

枚举前置状态,i = 0 to n-2, j =0 to M-1

动态规划的转移方程

j1 ∈ \in ∈ nieBo[j]
dp[i+1][j1] += dp[i][j];

动态规划的初始值

dp[0]为1,其它全为0。

动态规划的返回值

dp.back()之和

代码

template<int MOD =1000000007>classC1097Int{public:C1097Int(longlong llData =0):m_iData(llData% MOD){} C1097Int operator+(const C1097Int& o)const{returnC1097Int(((longlong)m_iData + o.m_iData)% MOD);} C1097Int&operator+=(const C1097Int& o){ m_iData =((longlong)m_iData + o.m_iData)% MOD;return*this;} C1097Int&operator-=(const C1097Int& o){ m_iData =(m_iData + MOD - o.m_iData)% MOD;return*this;} C1097Int operator-(const C1097Int& o){returnC1097Int((m_iData + MOD - o.m_iData)% MOD);} C1097Int operator*(const C1097Int& o)const{return((longlong)m_iData * o.m_iData)% MOD;} C1097Int&operator*=(const C1097Int& o){ m_iData =((longlong)m_iData * o.m_iData)% MOD;return*this;} C1097Int operator/(const C1097Int& o)const{return*this* o.PowNegative1();} C1097Int&operator/=(const C1097Int& o){*this/= o.PowNegative1();return*this;}booloperator==(const C1097Int& o)const{return m_iData == o.m_iData;}booloperator<(const C1097Int& o)const{return m_iData < o.m_iData;} C1097Int pow(longlong n)const{ C1097Int iRet =1, iCur =*this;while(n){if(n &1){ iRet *= iCur;} iCur *= iCur; n >>=1;}return iRet;} C1097Int PowNegative1()const{returnpow(MOD -2);}intToInt()const{return m_iData;}private:int m_iData =0;;};classSolution{public:intnumOfWays(int n){ vector<vector<int>> v; vector<int>tmp(3);for(tmp[0]=0;tmp[0]<3; tmp[0]++)for(tmp[1]=0; tmp[1]<3; tmp[1]++)for(tmp[2]=0; tmp[2]<3; tmp[2]++){if((tmp[0]== tmp[1])||(tmp[1]== tmp[2]))continue; v.emplace_back(tmp);} vector<vector<int>>neiBo(v.size());for(int i =0; i < v.size();i++)for(int j =0; j < v.size(); j++){if(v[i][0]== v[j][0])continue;if(v[i][1]== v[j][1])continue;if(v[i][2]== v[j][2])continue; neiBo[i].emplace_back(j);} vector<C1097Int<>>pre(v.size(),1);for(int i =1; i < n; i++){ vector<C1097Int<>>dp(v.size());for(int j =0; j < v.size(); j++){for(int j1 : neiBo[j]){ dp[j1]+= pre[j];}} pre.swap(dp);}auto ans =accumulate(pre.begin(), pre.end(), C1097Int<>());return ans.ToInt();}};

单元测试

TEST_METHOD(TestMethod11){auto res =Solution().numOfWays(1);AssertEx(12, res);}TEST_METHOD(TestMethod12){auto res =Solution().numOfWays(2);AssertEx(54, res);}TEST_METHOD(TestMethod13){auto res =Solution().numOfWays(3);AssertEx(246, res);}TEST_METHOD(TestMethod14){auto res =Solution().numOfWays(7);AssertEx(106494, res);}TEST_METHOD(TestMethod15){auto res =Solution().numOfWays(5000);AssertEx(30228214, res);}

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步ZEEKLOG学院,听白银讲师(也就是鄙人)的讲解。
https://edu.ZEEKLOG.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.ZEEKLOG.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

Read more

Flutter 组件 allure_report 的适配 鸿蒙Harmony 实战 - 驾驭自动化质量呈现、实现鸿蒙端测试结果高度结构化与工业级指标看板方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 allure_report 的适配 鸿蒙Harmony 实战 - 驾驭自动化质量呈现、实现鸿蒙端测试结果高度结构化与工业级指标看板方案 前言 在鸿蒙(OpenHarmony)生态的金融级交付规范、大规模复杂政务应用开发以及对代码缺陷零容忍的自动驾驶车载终端应用中。“测试结果的透明性与可追溯展示维度”是衡量整个技术团队全交付链条的最终质量门禁。面对包含数千个集成测试、单元测试、甚至是 UI 端到端测试(E2E)的 0308 批次工程大盘。如果仅仅依靠命令行中冰冷的一串 PASS 和 FAIL 或者是干瘪的 txt 终端日志。不仅会导致在定位历史回退(Regression)时让测试工程师如同在代码废墟中盲人摸象。更会因为缺乏大局观的指标呈现,令技术高层在跨终端指挥调度时陷入严重的信息盲区。 我们需要一种“数据生动、多维追踪”的测试资产汇报艺术。 allure_report 是一套专注于无缝整合全球公认顶级测试报告框架

By Ne0inhk
Flutter 三方库 adb_dart 的鸿蒙化适配指南 - 实现纯 Dart 的 ADB 协议通信、远程控制手机与自动化调试脚本开发

Flutter 三方库 adb_dart 的鸿蒙化适配指南 - 实现纯 Dart 的 ADB 协议通信、远程控制手机与自动化调试脚本开发

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 adb_dart 的鸿蒙化适配指南 - 实现纯 Dart 的 ADB 协议通信、远程控制手机与自动化调试脚本开发 前言 在 Flutter for OpenHarmony 的开发辅助工具中,有时我们需要直接从应用内部与 Android 设备(作为分布式设备的一部分)进行调试交互,或者构建一个纯 Dart 的桌面端调试器。adb_dart 是一个实现了完整 ADB(Android Debug Bridge)通信协议的 Dart 库。它允许你在不依赖外部 adb 二进制文件的情况下,直接通过 Socket 发送指令。本文将讲解如何在鸿蒙端利用该库构建跨平台的调试方案。 一、原理解析

By Ne0inhk
【基于SSH加密安全连接到远程openclaw网关的方法】一个不需要HTTPS的安全连接方案

【基于SSH加密安全连接到远程openclaw网关的方法】一个不需要HTTPS的安全连接方案

原文:【windows电脑浏览器直接访问虚拟机或云端openclaw的方法】一个不需要HTTPS的安全连接通道(基于SSH),安全开启openclaw工作环境 说明:开启安全的沙箱openclaw,资源占用较小,访问交互快捷舒适,网络安全加密。 痛点: 远程开启了openclaw,想暴露openclaw网关到公网又怕不安全。 不想折腾Mac,不想折腾手机,不想折腾QQ,飞书,微信等通讯方式。 打算部署一个openclaw的沙盒环境,于是想到了 VMWare这个老牌工具。起初以为在vmware中可以有GUI界面,可以方便地用Firefox浏览器实现对话。可是,实际体验后,发现直接在VMWare中跑的时候用firefox会就让系统变得有点卡顿(运行内存8G),而且ubuntu输入法也很不习惯,那么,有没有一种方法,可以在windows11(宿主)中打开浏览器直接访问openclaw对话网页呢? 理论上存在两种方法: 1:把openclaw的Gateway的监听IP设置为0.0.0.0(或局域网IP),这样通过<IP>:18789可以访问openclaw的webUI; 2:用

By Ne0inhk