​LeetCode刷题实战276:栅栏涂色

(C++)Leetcode狂刷200题——标签“动态规划篇--简单难度10道(两道重复) #276. 栅栏涂色 第九道、 #276. 栅栏涂色 有 k 种颜色的涂料和一个包含 n 个栅栏柱的栅栏,每个栅栏柱可以用其中一种颜色进行上色。 你需要给所有栅栏柱上色,并且保证其中相邻的栅栏柱 最多连续两个 颜色相同。然后,返回所有有效涂色的方案数。 注意: n 和 k 均为非负的整数。 示例: 输入: n = 3,k = 2 输出: 6 解析: 用 c1 表示颜色 1,c2 表示颜色 2,所有可能的涂色方案有: 柱 1 柱 2 柱 3 1 c1 c1 . 阅读详情

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 栅栏涂色,我们先来看题面:

https://leetcode-cn.com/problems/paint-fence/

There is a fence with n posts, each post can be painted with one of the k colors.

You have to paint all the posts such that no more than two adjacent fence posts have the same color.

Return the total number of ways you can paint the fence.

Note:
n and k are non-negative integers

有 k 种颜色的涂料和一个包含 n 个栅栏柱的栅栏,每个栅栏柱可以用其中一种颜色进行上色。

你需要给所有栅栏柱上色,并且保证其中相邻的栅栏柱 最多连续两个 颜色相同。然后,返回所有有效涂色的方案数。

注意: n 和 k 均为非负的整数。

示例

解题

https://www.dyxmq.cn/program/algorithms/leetcode276-paint-fence.html

方法一:递推

假设前一个栅栏的颜色数量为f(n - 1),再前一个栅栏的颜色数量为f(n - 2。

递推的思路:

如果当前栅栏颜色和前一个栅栏颜色一样,它的选择是k - 1(因为当前栅栏和前一个栅栏颜色一样,所以前一个栅栏颜色和更前一个展览的颜色不能一样,少一种颜色选择),这种情况的颜色数量为f(n - 2) * (k - 1)。

如果当前栅栏颜色和前一个栅栏颜色不一样,那么当前栅栏的颜色选择就只有k - 1种,总的颜色数量为f(n - 1) * (k - 1)。

总结出来的递推公式:f(n) = f(n - 1) * (k - 1) + f(n - 2) * (k - 1)。

class Solution {
public:
     int numWays(int n, int k) {
        int prev, pprev, rs, i;
        if (n <= 0 || k <= 0)
            return 0;
 
        if (n == 1)
            return k;
 
        pprev = k;
        prev = k * k;
        rs = prev;
        for (i = 2; i < n; i++) {
            rs = pprev * (k - 1) + prev * (k - 1);
            pprev = prev;
            prev = rs;
        }
 
        return rs;
    }
};

方法二:动态规划

以前面两个栅栏的颜色来确定当前栅栏的颜色:

如果前两个栅栏的颜色相同,那么当前栅栏的颜色有k - 1种。

如果前两个栅栏的颜色不同,那么当前栅栏的颜色有k种。

分别以dp1和dp2保存颜色相同和不同的种数,可以总结出来的状态转移方程:

  • dp1 = prev_dp1

  • dp2 = (k - 1) * (dp1 + dp2)

dp1是相同的颜色数量,它和上一个栅栏颜色相同,所以就等于上一个栅栏颜色数量。dp2是不同的颜色数量,它等于上一个栅栏颜色总量的和乘以k - 1。

class Solution {
public:
    int numWays(int n, int k) {
        int dp1, dp2, rs, i;
        if (n <= 0 || k <= 0)
            return 0;
 
        if (n == 1)
            return k;
 
        dp1 = k;
        dp2 = k * (k - 1);
        for (i = 2; i < n; i++) {
            rs = (dp1 + dp2) * (k - 1);
            dp1 = dp2;
            dp2 = rs;
        }
        return dp1 + dp2;
    }
};

好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。

上期推文:

LeetCode1-260题汇总,希望对你有点帮助!

LeetCode刷题实战261:以图判树

LeetCode刷题实战262:行程和用户

LeetCode刷题实战263:丑数

LeetCode刷题实战264:丑数 II

LeetCode刷题实战265:粉刷房子II

LeetCode刷题实战266:回文排列

LeetCode刷题实战267:回文排列II

LeetCode刷题实战268:丢失的数字

LeetCode刷题实战269:火星词典

LeetCode刷题实战270:最接近的二叉搜索树值

LeetCode刷题实战271:字符串的编码与解码

LeetCode刷题实战272:最接近的二叉搜索树值 II

LeetCode刷题实战273:整数转换英文表示

LeetCode刷题实战274:H指数

LeetCode刷题实战275:H 指数 II

ArcGIS JSAPI 高级教程 - 添加多个 box 立方体 - 通过顶点、索引、UV 自定义每个 box、每个面不同颜色 ArcGIS JSAPI 高级教程 - 添加多个 box 立方体 - 通过顶点、索引、UV 自定义每个 box、每个面不同颜色。 阅读详情

相关推荐

DisplayPort信号通道深度解析:从物理层到协议栈

DisplayPort(DP)是一种面向高速串行通信的数字显示接口标准,其核心在于嵌入式时钟、自适应均衡与链路训练三位一体的物理层架构。不同于HDMI依赖独立时钟的TMDS方案,DP通过差分主链路(Main Link)承载编码数据流,以8b/10b或128b/132b编码实现高带宽与强鲁棒性。该技术价值体现在多速率自适应、误码恢复能力及对PCB布线与阻抗控制的严苛要求,广泛应用于8K显示、工业视觉、GPU直连等高性能场景。本文聚焦DP信号通道的管脚级实现、三层协议解耦(物理层/数据链路层/事务层)及链路训练

weixin_34214500的博客 254

276. 栅栏涂色

276. 栅栏涂色 有 k 种颜色的涂料和一个包含 n 个栅栏柱的栅栏,请你按下述规则为栅栏设计涂色方案: 每个栅栏柱可以用其中 一种 颜色进行上色。 相邻的栅栏柱 最多连续两个 颜色相同。 给你两个整数 k 和 n ,返回所有有效的涂色 方案数 。 输入:n = 3, k = 2 输出:6 解释:所有的可能涂色方案如上图所示。注意,全涂红或者全涂绿的方案属于无效方案,因为相邻的栅栏柱 最多连续两个 颜色相同。 解法一:标准 DP 思想 状态表示 f[i][0] 表示第 i 个与第 i -

不搞数学的汤老师 1991

解密TMS320F28377D双核工程中的内存分配艺术:从CMD文件到实战优化

本文深入解析TMS320F28377D双核DSP的内存管理艺术,从CMD文件配置到实战优化技巧。详细介绍了SARAM、GSRAM等内存类型的特性与配置方法,提供双核协同、性能优化及高级调试的实用方案,帮助开发者提升系统实时性和稳定性。

weixin_29190651的博客 663

LeetCode-Python-276. 栅栏涂色

有 k 种颜色的涂料和一个包含 n 个栅栏柱的栅栏,每个栅栏柱可以用其中一种颜色进行上色。 你需要给所有栅栏柱上色,并且保证其中相邻的栅栏柱 最多连续两个颜色相同。然后,返回所有有效涂色的方案数。 注意: n 和k 均为非负的整数。 示例: 输入: n = 3,k = 2 输出: 6 解析: 用 c1 表示颜色 1,c2 表示颜色 2,所有可能的涂色方案有: ...

Keep Coding 1928

【MATLAB-app】系列教程(含视频)第4、5、6课:实战_制作简单的图像处理软件

写作时间: 2020-12-27 我的教程目录 第1课:初步了解appdesigner 第2课:学会制作一个计算器 第3课:学习更多的控件(重点!) 第4课:实例1:制作一个图像处理软件 第5课:学习APPdesigner的设计精髓,框架 第6课:结合使用多种控件,函数等,丰富我们的实例1 第7课:app设计打包,完成工程应用导出 标题: 第4课:我的实例_学会制作一个图像处理软件 本文目录: 1.先看看我之前的一个工程 2.常用的基本组件控件 3.最常用且实用的控件的用法 -3.1 editfilel

wind 4054

漏检率从23%降至1.3%:YOLOv8交通车辆计数与违章识别完整落地方案

本文分享了基于YOLOv8+ByteTrack的交通视频分析系统实战经验,针对车辆计数和违章识别两大核心功能,提出了完整的工程化解决方案。系统采用边缘计算架构,单张GTX 1660即可稳定处理8路1080P视频流,实现了白天98.7%、夜间96%以上的车辆计数准确率。文章详细剖析了交通视频分析的四大落地痛点,系统架构设计思路,以及遮挡处理、光照适应、多路并发等关键技术优化方案,重点介绍了车辆计数三重校验机制和三类违章识别的工程实现细节。通过ROI裁剪、TensorRT加速、动态抽帧等优化手段,显著提升了系统

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 340

LeetCode 276:栅栏涂色

题目: 状态:即栅栏的索引位置和 是否与上一个同色, 两种状态;dp定义: 指 第 i 个栅栏与第 i-1个栅栏同色的颜色可能性,指第 i 个栅栏与上一个不同色的颜色可能性选择: 根据题意,即和上一个同色,由于同一个颜色只能相邻两次,那么第 i-1个栅栏注定不能和上一个(i-2)同色! 所以 ; 而指 i 和 i-1不同色,那么 i-1位置的栅栏 既可以与i-2同色也可以与i-2不同色,且此时 i栅栏可以有 k-1种颜色可选;base case: 从 i=1 开始算,dp[1][0]=0 即第一次不可能和上

机械工程跑路哥 1114

26. 如何给 SAP BTP Cloud Foundry 环境分配运行时内存

摘要:本文解答了SAP BTP Cloud Foundry环境中Space可用内存为0MB的问题。指出Space内存配额取决于Org配额分配,其计算方式为Org总配额减去所有运行中应用实例的内存预留总和。详细解释了SAP BTP的资源分配层级(Global account→Subaccount→Environment→Org→Space),并说明如何通过Global account的Entity Assignments查看Memory Plan配额分配(以GB为单位)。最后建议遇到问题的用户检查Subacc

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1264

【LeetCode276】栅栏涂色

1.题目描述 有 k 种颜色的涂料和一个包含 n 个栅栏柱的栅栏,每个栅栏柱可以用其中一种颜色进行上色。 你需要给所有栅栏柱上色,并且保证其中相邻的栅栏柱 最多连续两个颜色相同。然后,返回所有有效涂色的方案数。 注意: n 和k 均为非负的整数。 示例: 输入: n = 3,k = 2 输出: 6 解析: 用 c1 表示颜色 1,c2 表示颜色 2,所有可能的涂色方案有: ...

u011646912的博客 1840

主流反爬虫、反作弊防护与风控对抗手段

主流反爬虫、反作弊风控防护中的核心设计点与对抗策略

吴秋霖的博客 2555

【二】MADDPG多智能体算法实现(parl)【追逐游戏复现】

论文全称:Multi-Agent Actor-Critic for Mixed Cooperative-Competitive Environments 论文原文:https://download.youkuaiyun.com/download/sinat_39620217/16203960 论文翻译:https://blog.youkuaiyun.com/qiusuoxiaozi/article/details/79066612 ...

丨汀、的博客 2万+

LeetCode第276题_栅栏涂色

本文解析了LeetCode第276题"栅栏涂色"的解法。这是一道中等难度的动态规划问题,要求计算在最多两个相邻栅栏同色的约束下,使用k种颜色涂n个栅栏的所有有效方案数。文章详细阐述了状态转移方程的设计思路,提供了C#、Python、C++三种语言的实现代码,并进行了性能对比分析。特别强调了处理特殊情况和大数据取模的重要性,同时指出了常见错误点和优化技巧。该解法时间复杂度为O(n),空间复杂度优化为O(1),非常适合想要提升动态规划技能的算法学习者。

qq_40263592的博客 2086

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Leetcode 276.栅栏涂色

Time: 20190904 Type: Easy 题目描述 有 k 种颜色的涂料和一个包含 n 个栅栏柱的栅栏,每个栅栏柱可以用其中一种颜色进行上色。 你需要给所有栅栏柱上色,并且保证其中相邻的栅栏柱 最多连续两个 颜色相同。然后,返回所有有效涂色的方案数。 注意: n 和 k 均为非负的整数。 示例: 输入: n = 3,k = 2 输出: 6 解析: 用 c1 表示颜色 1,c2表示颜色 2...

Bing's Blog 2901

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【中等】力扣算法题解析LeetCode276:栅栏涂色

栅栏涂色方案数计算。给定k种颜色和n个栅栏柱,计算所有满足“相邻栅栏柱最多连续两个颜色相同”的涂色方案数。 解决方案:采用动态规划方法,通过两个状态变量优化空间复杂度: same:当前栅栏与前一栅栏同色的方案数 diff:当前栅栏与前一栅栏不同色的方案数 关键点: 状态转移: 同色方案数 = 前一次不同色方案数 不同色方案数 = (前一次同色+不同色方案数) × (k-1) 边界条件: n=1时:方案数为k n=2时:方案数为k×k

ylumwd的博客 728

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Leetcode #276: 栅栏涂色 [动态规划]

题目 有 k 种颜色的涂料和一个包含 n 个栅栏柱的栅栏,每个栅栏柱可以用其中一种颜色进行上色。 你需要给所有栅栏柱上色,并且保证其中相邻的栅栏柱 最多连续两个 颜色相同。然后,返回所有有效涂色的方案数。 注意: n 和 k 均为非负的整数。 示例: 输入: n = 3,k = 2 输出: 6 解析: 用 c1 表示颜色 1,c2 表示颜色 2,所有可能的涂色方案有: ...

weixin_39784818的博客 2183

leetcode276. 栅栏涂色

有 k 种颜色的涂料和一个包含 n 个栅栏柱的栅栏,每个栅栏柱可以用其中一种颜色进行上色。 你需要给所有栅栏柱上色,并且保证其中相邻的栅栏柱 最多连续两个颜色相同。然后,返回所有有效涂色的方案数。 注意: n 和k 均为非负的整数。 示例: 输入: n = 3,k = 2 输出: 6 解析: 用 c1 表示颜色 1,c2 表示颜色 2,所有可能的涂色方案有: ...

少说,多做。 4015

leetcode 算法题276 (简单074) 栅栏涂色

leetcode 算法题276 (简单074) 回文排列 题目介绍 会员试题 先写非会员的 等写完了 开个会员统一写会员题目....

FYuu95100的博客 1126

LeetCode 276. 栅栏涂色(DP)

文章目录1. 题目2. 解题2.1 DP超时解 1. 题目 有 k 种颜色的涂料和一个包含 n 个栅栏柱的栅栏,每个栅栏柱可以用其中一种颜色进行上色。 你需要给所有栅栏柱上色,并且保证其中相邻的栅栏柱 最多连续两个 颜色相同。然后,返回所有有效涂色的方案数。 注意: n 和 k 均为非负的整数。 示例: 输入: n = 3,k = 2 输出: 6 解析: 用 c1 表示颜色 1,c2 表示颜色 2,所有可能的涂色方案有: 柱 1 柱 2 柱 3 -----

Michael是个半路程序员 1893

【LeetCode - 276】栅栏涂色

【简单】动态规划

学哥斌的博客 1310

力扣276栅栏涂色

两种动态规划法 一、当前栅栏i与之前栅栏i-1颜色相同,更之前栅栏i-2的涂色方案为F(i-2),当前栅栏的涂色方式有k-1种。 i与i-1的颜色不一样,当前栅栏颜色涂色方式有k-1种 F(i)=F(i-2)*k-1+F(i-1)*k-1 二、当前i的颜色,由i-1和i-2的颜色是否相同决定 从i=2开始 int diff_color = k * (k - 1); int same_color =...

baidu_34549562的博客 1938

LeetCode第 276 题:栅栏涂色(C++)

276.栅栏涂色 dp[i]表示第i个栅栏的颜色方案数,根据题意,显然dp[1] = k, dp[2] = k*k。当i >= 3的时候: i和i-1颜色相同:dp[i] = dp[i-2]*(k-1),表示去掉i-2的颜色(将i-1和i连起来考虑,两者是相同的),还有k-1种可选 i和i-1颜色不同:dp[i] = dp[i-1]*(k-1),表示去掉i-1的颜色,还剩下k-1种颜色可选 求方案数,使用相加。 第一种的理解:假设颜色为1,2,3,4,如果i-2的颜色为1,因为i与i-1的颜色相

zj 967

leetcode 276. 栅栏涂色

动态规划的呢,两种情况的,要么和前一种相同,要么不同的,所以是2d的数组,初始条件是 相同0,不同k种,状态转移方程是:当前和前一个相同,那么就是n-1和n-2的不同方案数量,因n, n-1, n-2不能相同;和前一个不同,剩下k-1种颜色可选,那么乘上k-1就行,n-1和n-2是否相同不重要,所以是n-1的方案数量总和。 作者:九是否随意的称呼 链接:https://leetcode.cn/problems/paint-fence/solutions/2752076/276-zha-lan-tu-se-

邹九的个人博客 577

LeetCode-276. 栅栏涂色

有 k 种颜色的涂料和一个包含 n 个栅栏柱的栅栏,每个栅栏柱可以用其中一种颜色进行上色。 你需要给所有栅栏柱上色,并且保证其中相邻的栅栏柱 最多连续两个 颜色相同。然后,返回所有有效涂色的方案数。 注意: n 和 k 均为非负的整数。 示例: 输入: n = 3,k = 2 输出: 6 解析: 用 c1 表示颜色 1,c2 表示颜色 2,所有可能的涂色方案有: ...

jhhuang 784

leetcode-276-栅栏涂色-C语言

/* 解法一: * 使用回溯法,枚举所有的可能,该方法会超时。 * * */ void get(int n, int k, int *stack, int index, int *cnt){ int i; if(index<0 || index>n) return; if(index==n){ (*cnt)++;...

SFFS 409

java涂色_【LeetCode(Java) - 276】栅栏涂色

【LeetCode(Java) - 276】栅栏涂色【LeetCode(Java) - 276】栅栏涂色文章目录1、题目描述2、解题思路3、解题代码1、题目描述2、解题思路??经典的动态规划问题??定义 f[n] 表示 n 个栅栏时的总方案数。??1、当 n 为 1 时,上色方案数为 f[1] = k;??2、当 n 为 2 时,第 2 个栅栏的颜色可以和第 1 个一样,也可以不一样,因此总共有 ...

weixin_30837611的博客 641
上一篇: 网站接入QQ登录功能的实现
下一篇: 辞退了一位简历造假的程序员,简历美化可以,造假不可取!
编程IT圈
博客等级 码龄6年 1130粉丝 544原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值