网站字头优化,做芯片外贸生意上哪个网站,网站的优势与不足,网站网页设计教程本文涉及知识点
C动态规划
LeetCode1411. 给 N x 3 网格图涂色的方案数
提示 你有一个 n x 3 的网格图 grid #xff0c;你需要用 红#xff0c;黄#xff0c;绿 三种颜色之一给每一个格子上色#xff0c;且确保相邻格子颜色不同#xff08;也就是有相同水平边或者垂直…本文涉及知识点
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[i1][j1] dp[i][j];
动态规划的初始值
dp[0]为1其它全为0。
动态规划的返回值
dp.back()之和
代码
templateint MOD 1000000007
class C1097Int
{
public:C1097Int(long long llData 0) :m_iData(llData% MOD){}C1097Int operator(const C1097Int o)const{return C1097Int(((long long)m_iData o.m_iData) % MOD);}C1097Int operator(const C1097Int o){m_iData ((long long)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){return C1097Int((m_iData MOD - o.m_iData) % MOD);}C1097Int operator*(const C1097Int o)const{return((long long)m_iData * o.m_iData) % MOD;}C1097Int operator*(const C1097Int o){m_iData ((long long)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;}bool operator(const C1097Int o)const{return m_iData o.m_iData;}bool operator(const C1097Int o)const{return m_iData o.m_iData;}C1097Int pow(long long n)const{C1097Int iRet 1, iCur *this;while (n){if (n 1){iRet * iCur;}iCur * iCur;n 1;}return iRet;}C1097Int PowNegative1()const{return pow(MOD - 2);}int ToInt()const{return m_iData;}
private:int m_iData 0;;
};class Solution {public:int numOfWays(int n) {vectorvectorint v;vectorint 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);}vectorvectorint 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);}vectorC1097Int pre(v.size(), 1);for (int i 1; i n; i) {vectorC1097Int 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);}扩展阅读
我想对大家说的话工作中遇到的问题可以按类别查阅鄙人的算法文章请点击《算法与数据汇总》。学习算法按章节学习《喜缺全书算法册》大量的题目和测试用例打包下载。重视操作有效学习明确的目标 及时的反馈 拉伸区难度合适 专注闻缺陷则喜(喜缺)是一个美好的愿望早发现问题早修改问题给老板节约钱。子墨子言之事无终始无务多业。也就是我们常说的专业的人做专业的事。如果程序是一条龙那算法就是他的是睛失败反思成功 成功反思成功
视频课程
先学简单的课程请移步CSDN学院听白银讲师也就是鄙人的讲解。 https://edu.csdn.net/course/detail/38771 如何你想快速形成战斗了为老板分忧请学习C#入职培训、C入职培训等课程 https://edu.csdn.net/lecturer/6176
测试环境
操作系统win7 开发环境 VS2019 C17 或者 操作系统win10 开发环境 VS2022 C17 如无特殊说明本算法用**C**实现。