nyoj-0469-擅长排列的小明 II

思路:递推
分析:为了简便起见,我们用Ai代表第i个数字 , 由于A1一直是1,所以A2只能是2或3。假设dp[n]表示1->n这个序列的方案数
           1.当A2=2时,从A2到An的排列(2~n)相当于从A1到An-1的排列(1~n-1)(把每个数字都加1),一共有dp[n-1]种情况。
           2.当A2=3时,A3可能为2,4,5。
               1、当A3=2时,A4一定等于4,此时从A4到An的排列(4~n)相当于从A1到An-3的排列(把每个数字都加3),一共有dp[n-3]种情况。
               2、当A3=4时,不管A4取不取2,都不能形成满足题意的排列,故此种情况不可能发生。
               3、当A3=5时,排列只可能是1 ,3, 5,7,9......10,8,6,4,2,所以一共有1种情况。
           3综上所述,dp[n]=dp[n-3]+dp[n-1]+1;(n>3)

代码:

#include<bits/stdc++.h>
using namespace std;
int n, ans;
int dp[60];
int main() {
    dp[1] = 1; dp[2] = 1; dp[3] = 2;
    for(int i = 4; i <= 55; i++) 
        dp[i] = dp[i-1] + dp[i-3] + 1;
    while(scanf("%d", &n) == 1) printf("%d\n", dp[n]);
    return 0;     
}

 

posted on 2018-04-27 23:28  kindleheart  阅读(126)  评论(0编辑  收藏  举报