题意理解
一组从1到N的序列数字排序,要求如下
1.数字1必须排最左边。
2.相邻数字不能相差超过2.
问一共有多少种排法?
问题分析:
用动规来做。设dp[i]为前i个数的排法数量。dp[1] = 1,dp[2] = 1(排法是12),dp[3] = 2(排法是123,132);下面分析dp[i]和dp[1]...dp[i-1]之间的关系:
dp[4]的排法有4种,分别为
1234
1243
1324
1342
前两个去掉1,就是2,3,4的排法数量,它和1,2,3的排法数量相同,即为dp[2];
第三个去掉132,就是4的排法数量,它和1的排法数量相同,即为dp[1];
第四个是特殊的,先奇数排序再偶数排序,算一个。
所以 dp[4] = dp[3] + dp[1] + 1;
一般公式为:dp[i] = dp[i-1] + dp[i -3] + 1;
其他:
参考思路学到了,动规是一直的痛。。。是时候改变策略了。
链接
https://github.com/xierensong/learngit/blob/master/timus/t1260.cpp