题目:对1到N这些数进行排列,1在最左边,相邻的两个数之差不能超过2,求有多少种排列方法?
解法:dp[i] = dp[i-1] + dp[i-3] + 1;
解释:对dp[n],有3种情况:
1、12……(dp[n-1])
2、1324……(dp[n-3])
3、1357……8642(一种确定的情况)
代码:
#include <cstdio>
using namespace std;
int main()
{
int N;
scanf("%d",&N);
int dp[56];
dp[1] = dp[2] = 1;
dp[3] = 2;
for(int i = 4;i<=N;++i)
dp[i] = dp[i-1]+dp[i-3]+1;
printf("%d\n",dp[N]);
return 0;
}