码迷,mamicode.com
首页 > 其他好文 > 详细

hihocoder-1732-1-偏差排列

时间:2018-05-01 23:21:52      阅读:581      评论:0      收藏:0      [点我收藏+]

标签:表示   std   位置   long   main   cpp   ++i   nbsp   while   

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\n", ans );
	}  
	return 0; 
} 

  

 

hihocoder-1732-1-偏差排列

标签:表示   std   位置   long   main   cpp   ++i   nbsp   while   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!