HDOJ - 2045 RPG难题

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2045

算法思想:

1)有三种颜色,在涂某一块区域时,由于它的前一块区域已经确定,且相邻区域不能重复,所以在这一块区域上有两种涂法,因此,大体意识为 a[i]=a[i-1]*2

2)(为了方便描述,我们用1,2,3分别代表R,P,G)假设第一块涂色为1,则当以第n块结尾的时候,第n块区域就不能再为1。那么,在第n块区域中一共a[n]中涂法中,有多少涂法是1呢?用递推的思想,显然,如果第n-1块涂的不是1,那么第n块区域就可以涂成1。我们用b[i]表示a[i]种涂法里被涂成1的数量,可得b[i]=a[i-1]-b[i-1]。

3)综合以上两点,我们可以得出,方格总是为n时,可以涂的方法数就是第一步计算出来的理想值减去第二步中那些和第一块相冲突的个数,即:(a[i]-b[i])*3。当然不要忘了最后的乘以3哦!

代码如下:

	a[1]=1;
	for (int i(2);i<=50;i++) a[i]=a[i-1]*2;
	b[3]=2;
	for (int i(4);i<=50;i++) b[i]=a[i-1]-b[i-1];
	for (int i(1);i<=50;i++) c[i]-=a[i]-b[i];

考虑代码优化:

仔细观察上面的方法,可以发现,其实b数组本身就是用a数组产生的,并且只是用作临时存贮。那么能不能只用一个数组来节省空间呢?
1	2	3	4	5	6	7	8 
a	1	2	4	8	16	32	64	...
b	0	0	2	2	6	10	22	42
c	1	2	2	6	10	22	42	...

通过观察,我们可以发现:

c[i]=a[i]-c[i-1]

=> a[i]=c[i]+c[i-1]

=> a[i-1]=c[i-1]+c[i-2]

a[i]=a[i-1]*2

整理得:c[i]=(c[i-1]+c[i-2])*2-c[i-1]

      即:c[i]=c[i-1]+c[i-2]*2

代码如下:

a[1]=1;
	a[2]=2;
	a[3]=2;
	for (int i(4);i<=50;i++) a[i]=a[i-1]+a[i-2]*2;


我的博客



全部评论

相关推荐

01-30 22:03
门头沟学院 Java
用微笑面对困难:我滴妈,【俩月】【实习】【主管】仨debuff吃满了,独立设计开发的项目写了绝大占比的运营板块,你独立开发,那维护、问题复盘、日志更新、bug、策划书全是自己整的? 不建议写那么大,可以从小出发更容易
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 一张图晒出你司的标语 #
4206次浏览 75人参与
# AI面会问哪些问题? #
27270次浏览 544人参与
# 米连集团26产品管培生项目 #
13266次浏览 285人参与
# 你的实习产出是真实的还是包装的? #
19941次浏览 342人参与
# 找AI工作可以去哪些公司? #
8761次浏览 224人参与
# 春招至今,你的战绩如何? #
63972次浏览 575人参与
# 开放七大实习专项,百度暑期实习值得冲吗 #
14944次浏览 219人参与
# 从事AI岗需要掌握哪些技术栈? #
8649次浏览 292人参与
# 你做过最难的笔试是哪家公司 #
32653次浏览 222人参与
# 中国电信笔试 #
31606次浏览 284人参与
# 投递几十家公司,到现在0offer,大家都一样吗 #
340641次浏览 2173人参与
# 阿里笔试 #
178181次浏览 1308人参与
# 第一份工作一定要去大厂吗 #
14302次浏览 122人参与
# 金三银四,你的春招进行到哪个阶段了? #
21998次浏览 280人参与
# 沪漂/北漂你觉得哪个更苦? #
9679次浏览 193人参与
# HR最不可信的一句话是__ #
6121次浏览 113人参与
# 应届生第一份工资要多少合适 #
20650次浏览 86人参与
# AI时代,哪个岗位还有“活路” #
11329次浏览 339人参与
# 春招你拿到offer了吗 #
830916次浏览 9985人参与
# 长得好看会提高面试通过率吗? #
22393次浏览 254人参与
# 聊聊你的职场新体验 #
336387次浏览 1894人参与
# 学历对求职的影响 #
664949次浏览 4248人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务