Paint Fence
2016-07-09 06:41
316 查看
There is a fence with
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.
Notice
Example
Given
分析:
这种给定一个规则,计算有多少种结果的题目一般都是动态规划,因为我们可以从这个规则中得到递推式。根据题意,不能有超过连续两根柱子是一个颜色,也就意味着第三根柱子要么跟第一个柱子不是一个颜色,要么跟第二根柱子不是一个颜色。如果不是同一个颜色,计算可能性的时候就要去掉之前的颜色,也就是k-1种可能性。假设dp[1]是第一根柱子及之前涂色的可能性数量,dp[2]是第二根柱子及之前涂色的可能性数量,则dp[3]=(k-1)*dp[1] + (k-1)*dp[2]。
另一种理解是第三根柱子只有两种选择:跟第二根一个颜色dp[1]*(k-1),跟第二根不同颜色dp[2]*(k-1), 这两种情况是不互相包含的,是独立的,
Reference:
https://segmentfault.com/a/1190000003790650
nposts, each post can be painted with one of the
kcolors.
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.
Notice
nand
kare non-negative integers.
Example
Given
n=3,
k=2 return 6
post 1, post 2, post 3 way1 0 0 1 way2 0 1 0 way3 0 1 1 way4 1 0 0 way5 1 0 1 way6 1 1 0
分析:
这种给定一个规则,计算有多少种结果的题目一般都是动态规划,因为我们可以从这个规则中得到递推式。根据题意,不能有超过连续两根柱子是一个颜色,也就意味着第三根柱子要么跟第一个柱子不是一个颜色,要么跟第二根柱子不是一个颜色。如果不是同一个颜色,计算可能性的时候就要去掉之前的颜色,也就是k-1种可能性。假设dp[1]是第一根柱子及之前涂色的可能性数量,dp[2]是第二根柱子及之前涂色的可能性数量,则dp[3]=(k-1)*dp[1] + (k-1)*dp[2]。
另一种理解是第三根柱子只有两种选择:跟第二根一个颜色dp[1]*(k-1),跟第二根不同颜色dp[2]*(k-1), 这两种情况是不互相包含的,是独立的,
public int numWays(int n, int k) { // 当n=0时返回0 int dp[] = {0, k , k*k, 0}; if(n <= 2){ return dp ; } for(int i = 3; i <= n; i++){ // 递推式:第三根柱子要么根第一个柱子不是一个颜色,要么跟第二根柱子不是一个颜色 dp[3] = (k - 1) * (dp[1] + dp[2]); dp[1] = dp[2]; dp[2] = dp[3]; } return dp[3]; }
Reference:
https://segmentfault.com/a/1190000003790650
相关文章推荐
- nodejs express 框架安装
- 如何解决错误:A script behaviour has a different serialization layout when loading
- json基础
- 集中管理系统--puppet
- JStorm环境搭建
- QListWidget与QTableWidget的使用以及样式设置
- HTML5实测体验
- 使用CSS样式对表格进行美化并对伪类的使用进行解析
- html的选择器使用
- ng-style的用法
- .net 实体类与json转换(.net自带类库实现)
- 在Fragment、PreferenceFragment和OnPreferenceClickListener()里获取Activity
- React Native控件之Touchable*系列组件详解(28)
- 数组reduce方法的高级技巧
- jQuery获取同级元素的简单代码
- JavaScript基础重点(必看)
- 深入浅析JavaScript中的Function类型
- jQuery Easyui datagrid/treegrid 清空数据
- 老生常谈onBlur事件与onfocus事件(js)
- JQuery EasyUI学习教程之datagrid 添加、修改、删除操作