闲来无事,和队友刷了几道杭电的递推的题,以下是一些想法包括解题报告……(ps:以下数组均以dp命名是因为最近一直研究dp导致有些走火入魔……请见谅……)
hdu 2044 :http://acm.hdu.edu.cn/showproblem.php?pid=2044
显然到某一点i(i>2)可以有两个点可以到达,一个是i-1,一个是i-2,所以很显然设dp[i][j]为i--j的路线数,则有
dp[i][j]=dp[i][j-1]+dp[i][j-2]..
hdu 2045 : http://acm.hdu.edu.cn/showproblem.php?pid=2045
既然最后一个不能和第一个一样,那么当倒数第二个和第一个是同色的话,那么最后一个有两种颜色选择,如果倒数第二个和第一个不同色的话,最后一个只有一种颜色的选择。如果设有i个方格,那么dp[i-1]就是倒数第二个和第一个不同色的情况(因为如果包含同色时dp[i-1]就不满足当格子为i-1时最后一个和第一个颜色不一样…………有点绕……)那么倒数第二个和第一个同色的情况要如何处理呢,很显然,如果倒数第二个要和第一个同色,那么对于倒数第二个来说就是在倒数第三个的基础上涂色而且只能涂第一个那种颜色,然后最后一个格子有两种颜色的选择。因此,dp[i]=dp[i-1]+dp[i-2]*2。
hdu 2046 : http://acm.hdu.edu.cn/showproblem.php?pid=2046
对于第i列,要么放一个竖着的骨牌,要么和前一列放两个横着的骨牌,因此有dp[i]=dp[i-1]+dp[i-2]
hdu 2047 : http://acm.hdu.edu.cn/showproblem.php?pid=2047
结尾要么是O,要么不是O,如果是O的话下一个就不能是O,因为这题O是固定的,(不像第二题的颜色不固定,导致我用第二题的那种方法做直接果断的WA掉…不知道在第二题基础上改进下能不能套用此题…求正解…),因此用个二维数组dp[i][0/1]表示第i个字母是/不是O时的排列数,因此对于第i个字母来说,如果不是O,那么dp[i][1]=(dp[i-1][1]+dp[i-1][0])*2,也就是说不管i-1个字母是不是O,都可以果断的把这个位置填上E或F……如果是O,那么前一个字母一定不能是O,所以有dp[i][0]=dp[i][1],那么求排到第i个字母的种类数就是
dp[i][0]+dp[i][1]..
hdu 2048 : http://acm.hdu.edu.cn/showproblem.php?pid=2048
大家都要拿不是自己的,那么假设前i-1个人拿的都不是自己的,对于第i个人拿的只好是自己的,但是很显然,如果这个人用自己的前面i-1个人换,那么就能保证这i个人手中都不是自己的(假设第i个人和第j个人(0<j<i)换,那么第i个人拿的是j原来拿的未知人士的,反正不是i的,j拿的是i的,也不是自己的,其他人本来就假设拿的不是自己的,所以有这个结论……),要么前i个人很不幸刚好有1个拿的是自己的,就在要得奖的千钧一发时刻,第i个人和他换了(好残忍……),这样也可以保证前i个人拿的都不是自己的,而这个杯具的人可能是前i-1个任意一个,而在这种情况下是i-2个人拿的都不是自己的,所以dp[i]=(dp[i-1]+dp[i-2])*(i-1),而这个是前i个人拿的都不是自己的可能性,而总的可能性是i!,所以概率就是dp[i]/i!....
hdu 2049 : http://acm.hdu.edu.cn/showproblem.php?pid=2049
有了上一题的基础,这题很容易了,有m个人找错了,那么就意味着n-m个找对了,那么先选出找对了的是哪几对,也就是C(n,n-m),之后再乘以找错了的可能数,也就是上一题的dp[m]....所以答案就是dp[m]*C(n,n-m)【注意这里dp数组是上一题的!!】
hdu 2050 : http://acm.hdu.edu.cn/showproblem.php?pid=2050
我们可以先把一条折线拆开,也就是拆成两条平行线,那么对于第n对平行线,每一对都要和前面n-1对相交,这样可以一条可以增加2n-1个面,两条就是4n-2个面,所以第n次增加4n-2个面,刚开始,也就是n=1的时候有三个面(两条线),那么之后每次增加4n-2个面就有3+6+10+....+4n-2=1+2n^2,又因为对于i对平行线,我们把两条线的一端绑起来,也就是当做一条折线,那么这个时候有两个平面(就是在这两条线之外的两个平面)就会合并成一个平面,因为有i条折线,所以总平面数就为2n^2-n+1,所以输入n,输出2n^2-n+1即可。