暨南大学2019年复试机试-03

格子涂色

题目描述:有一行格子(不超过20 格)现在有三种颜料:红,黄,蓝。要每一个格子里面涂一种颜色,使得相邻格子颜色不能相同,而且首尾格子颜色也不能相同。问有多少种涂法?
这个问题当时卡了很多人,我也是弄了25分钟才搞出来。
分析:考虑到第一格可以涂3种颜色,第二格可以涂两种,第三格也可以涂两种…最后一格由于不能与倒数第二格同色且不能与第一格同色,所以我们可以分两种情况:1.如果第n-1格与第1格同色,那么第n格则有两种涂法;2.如果第n-1格与第1格不同色,则第n格只有有一种涂法
很容易看出来第n格的涂法,与第n-1格的涂法有关系。
上面这种dp思想供大家参考。
下面的代码是我考试的时候写出来的,具体原理大家可以尝试画出4个格子的涂法,如果有精力可以画出5个格子的涂法,规律大家一看便知。

#include<stdio.h>
int  main(){
	int n;
	int dp[21];
	dp[1]=3;//只有一个格子时有3种涂法
	dp[2]=6;//有两个格子时有6种涂法 
	dp[3]=6;//易知第n-1(2)个格子和第1个格子相邻故一定是不同色的,所以第n(3)个格子只能涂一种颜色 
	for(int i=4;i<=21;i++){//依次计算4个格子的涂法总数,5个格子的涂法总数...... 
		dp[i]=3;
		for(int j=1;j<i-1;j++){//根据规律,i个格子的涂法总数为:3*2*2*2....(要乘i-2个2)+dp[i-2] 
				dp[i]*=2;
			}
		dp[i]+=dp[i-2];
	}
	while(scanf("%d",&n)!=EOF){
		printf("%d\n",dp[n]);
	}
	return 0;
} 
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值