hihocoder-1732-1-偏差排列

hihocoder-1732-1-偏差排列 

#1732 : 1-偏差排列

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

如果一个1~N的排列P=[P1, P2, ... PN]中的任意元素Pi都满足|Pi-i| ≤ 1,我们就称P是1-偏差排列。

给定一个N,请你计算一共有少个不同的排列是1-偏差排列。

例如对于N=3,有3个1-偏差排列:[1, 2, 3], [1, 3, 2], [2, 1, 3]。

输入

一个整数N。  

对于50%的数据,1 ≤ N ≤ 15  

对于100%的数据,1 ≤ N ≤ 50

输出

一个整数表示答案

样例输入
3
样例输出
3

找规律,一个数字i,只能在i-1, i, i+1这三个位置存在。

dp[n][0] 表示第n个位置为n的合法数组种类数,dp[n][1]表示第n个位置为n-1,n在位置n-1的合法数组的种类数

  对于原本n个元素的数组,插入一个n+1,有两种插入方法,

放在n+1位置, 则dp[n+1][0] = dp[n][0] + dp[n][1]; 

放在n-1位置,  则 dp[n+1][1] = dp[n][0]; 

该种类数组成的序列是斐波纳挈序列。f[n] = f[n-1] + f[n-2]; 为其简化版本。

#include <cstdio> 
#include <cstdlib> 
const int MAXN = 100 + 10; 

int n;
long long ans, dp[MAXN][2]; 

void init(){
	dp[1][0] = 1; 
	dp[1][1] = 0;  
	for(int i=2; i<MAXN; ++i){
		dp[i][0] = dp[i-1][0] + dp[i-1][1]; 
		dp[i][1] = dp[i-1][0]; 
	}
}

int main(){

	init();  
	while(scanf("%d", &n) != EOF){
		ans = dp[n][0] + dp[n][1]; 

		printf("%lld
", ans );
	}  
	return 0; 
} 

  

原文地址:https://www.cnblogs.com/zhang-yd/p/8977115.html