题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2045
这是一道比较考验算法的题目,他的主要目的是考验选手的递推能力。
我一开始的思路是用递推去进行运算,一直用第一块涂3种颜色,第二块能涂2种,以此类推直到最后一块也为2种(先把第一个符合相邻的颜色不同全部列举),再用这个数减去“在满足第一个条件的但并不满足第二个条件的数量”,就能得到正确的数,但后来我发现这样进行在后面要考虑的情况太复杂,可以去推一推。
然后我便考虑用递归,下面是我的递归想法
但是却被提示时间超时,因此,我改变了想法,用递归得出的数据,使用了递推
但是,还是被系统说明超时,我觉得应该是算法中的数据比较大,运算比较麻烦,为此,我简化了我的算法
这个算法是通过上面的数据进行计算;可以说上面的两种递推都是由第一种递归的数据得到的;但是如果我能像师兄一样看出这个递推方式,就不用再去写麻烦的递归。
当然,这道题还有一个问题,没错,那就是int的溢出,所以需要使用float或者double,又或者可以用师兄的long long方式,但一定要保证数据不要溢出,不然的到的数据是错误的。