有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法.
以上就是著名的RPG难题.
如果你是Cole,我想你一定会想尽办法帮助LELE解决这个问题的;如果不是,看在众多漂亮的痛不欲生的Cole女的面子上,你也不会袖手旁观吧?
Input 输入数据包含多个测试实例,每个测试实例占一行,由一个整数N组成,(0<n<=50)。
Output 对于每个测试实例,请输出全部的满足要求的涂法,每个实例的输出占一行。
Sample Input 1 2
Sample Output 3 6
Author lcy
Source 递推求解专题练习(For Beginner)
Recommend lcy | We have carefully selected several similar problems for you: 2046 2050 2047 2049 2048 本道题采用的也是动态规划的思想,比HDoj 2041 超级楼梯问题难度提高,具体解决方法如下: 首先可以手工排列算出有一个格子时有三种涂法,有两个格子时有六种涂法,有三个格子时有六种涂法而当有四个及以上格子时手工排列就比较吃力,这该怎么办呢? 首先我们先创建一个 dp[ ] 数组,这个数组的下标对应着格子数,而元素的值是该格子数相应的涂法数 由此可得dp[1] = 3, dp [2] = 6, dp[3] = 6; 当i>=4时思路如下: 当在计算 dp[i] 时,dp[i-1] 和 dp[i-2] 已经算好并放入了数组中 当涂第n个格子时 : 假如第 n-1 个格子与开头格子的颜色不一样,说明前 n-1 个格子的排列满足了:1首位不同 2相邻不同 (也即是题目的要求),种类就有dp [i-1] 个,而最后一个格子既要满足与开头不同,又要满足与第 i-1 个不同,所以n个格子在这个情况下有 dp[i-1]*1 种涂法 假如第 n-1 个格子与开头格子的颜色一样,说明第 n-2 个格子的颜色肯定与开头不一样,也就是前 n-2 个格子的排列满足了题目的要求,排列种类有 dp [i-2] 个,此时第 n 个格子当满足了与第 i-1个不同色时也同时满足了与开头不同,故可以取两种颜色,所以n个格子在这个情况下有 dp[i-2]*2 种涂法 综上所述:n个格子的符合题目的排列共有 dp[i-1]*1 + dp[i-2]*2 中。 C语言代码如下:
#include<stdio.h> int main() { int n=0; long long dp[100]; //防止溢出,用long long while(scanf("%d",&n)!=EOF) { dp[1]=3; dp[2]=6; dp[3]=6; for(int i=4;i<=n;i++) dp[i]=dp[i-1]+2*dp[i-2]; printf("%lld\n",dp[n]); //注意输出格式控制符 } }