NYOJ 469 擅长排列的小明 II

擅长排列的小明 II

时间限制:1000 ms  |  内存限制:65535 KB

难度:3

描述

小明十分聪明,而且十分擅长排列计算。

有一天小明心血来潮想考考你,他给了你一个正整数n,序列1,2,3,4,5......n满足以下情况的排列:

1、第一个数必须是1

2、相邻两个数之差不大于2

你的任务是给出排列的种数。

输入
多组数据。每组数据中输入一个正整数n(n<=55).
输出
输出种数。
样例输入
4
样例输出
4
来源
Ural
上传者
李文鑫

解题:俺找规律才找出来的,开始写了个暴力搜索,输出前10项结果1 12 13 24 45 66 97 148 219 3110 46找到规律了吧。哈哈

先上超时代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <vector>
 6 #include <climits>
 7 #include <algorithm>
 8 #include <cmath>
 9 #define LL long long
10 using namespace std;
11 int d[51],n,cnt;
12 bool used[51];
13 void dfs(int cur,int pre){
14     if(cur > n) {
15         cnt++;
16         return;
17     }
18     int x = pre-2, y = pre+2;
19     for(x; x <= y && x <= n; x++){
20         if(x >= 1 && !used[x]){
21             used[x] = true;
22             dfs(cur+1,x);
23             used[x] = false;
24         }
25     }
26 }
27 int main(){
28     while(~scanf("%d",&n)){
29         cnt = 0;
30         memset(used,false,sizeof(used));
31         used[1] = true;
32         for(int i = 1; i <= n; i++) d[i] = i;
33         dfs(2,1);
34         printf("%d\n",cnt);
35     }
36     return 0;
37 }

AC代码

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <vector>
 6 #include <climits>
 7 #include <algorithm>
 8 #include <cmath>
 9 #define LL long long
10 using namespace std;
11 int main(){
12     int ans[60] = {1,1,1,2,4,6},i;
13     for(i = 4; i <= 55; i++)
14         ans[i] = ans[i-1]+ans[i-3]+1;
15     while(~scanf("%d",&i)) printf("%d\n",ans[i]);
16     return 0;
17 }

 

NYOJ 469 擅长排列的小明 II,布布扣,bubuko.com

时间: 2024-12-14 18:08:22

NYOJ 469 擅长排列的小明 II的相关文章

NYOJ 469 擅长排列的小明(二)

#include<stdio.h>int main(){ int a[56]={0,1,1,2,4}; for(int i=5;i<56;i++) a[i]=a[i-1]+a[i-3]+1; int num; //scanf("%d\n",&num); while(~scanf("%d",&num)) { //int n; //scanf("%d",&n); printf("%d\n"

nyoj469 擅长排列的小明 II

擅长排列的小明 II 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 小明十分聪明,而且十分擅长排列计算. 有一天小明心血来潮想考考你,他给了你一个正整数n,序列1,2,3,4,5......n满足以下情况的排列: 1.第一个数必须是1 2.相邻两个数之差不大于2 你的任务是给出排列的种数. 输入 多组数据.每组数据中输入一个正整数n(n<=55). 输出 输出种数. 样例输入 4 样例输出 4 思路: 由于A1一直是1,所以A2只能是2或3. 1.当A2=2时,从

擅长排列的小明 II(找规律)

擅长排列的小明 II 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 小明十分聪明,而且十分擅长排列计算. 有一天小明心血来潮想考考你,他给了你一个正整数n,序列1,2,3,4,5......n满足以下情况的排列: 1.第一个数必须是1 2.相邻两个数之差不大于2 你的任务是给出排列的种数. 输入 多组数据.每组数据中输入一个正整数n(n<=55). 输出 输出种数. 样例输入 4 样例输出 4 dp[i]=dp[i-1]+dp[i-3]+1; 题目大意:给出1-n

动态规划(6)——NYOJ469擅长排列的小明II*

擅长排列的小明 II 描述 小明十分聪明,而且十分擅长排列计算. 有一天小明心血来潮想考考你,他给了你一个正整数n,序列1,2,3,4,5......n满足以下情况的排列: 1.第一个数必须是1 2.相邻两个数之差不大于2 你的任务是给出排列的种数. 输入 多组数据.每组数据中输入一个正整数n(n<=55). 输出 输出种数. 样例输入 4 样例输出 4思路:设这个排列为A:1.A1肯定一直为1,所以A2要么是2要么是3:2.当A2=2时,从A2到An的排列数(2到n)相当于从A1到An-1的排

擅长排列的小明 II

擅长排列的小明 II 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 小明十分聪明,而且十分擅长排列计算. 有一天小明心血来潮想考考你,他给了你一个正整数n,序列1,2,3,4,5......n满足以下情况的排列: 1.第一个数必须是1 2.相邻两个数之差不大于2 你的任务是给出排列的种数. 输入 多组数据.每组数据中输入一个正整数n(n<=55). 输出 输出种数. 样例输入 4 样例输出 4 来源 Ural 上传者 李文鑫 本来用的是深搜,结果超时了,在讨论组组

nyoj 19 擅长排列的小明

擅长排列的小明 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 小明十分聪明,而且十分擅长排列计算.比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想为难他,在这5个数字中选出几个数字让他继续全排列,那么你就错了,他同样的很擅长.现在需要你写一个程序来验证擅长排列的小明到底对不对. 输入 第一行输入整数N(1<N<10)表示多少组测试数据, 每组测试数据第一行两个整数 n m (1<n<9,0<m<=n) 输出 在1-n中选

nyoj 19擅长排列的小明 (DFS)

擅长排列的小明 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 小明十分聪明,而且十分擅长排列计算.比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想为难他,在这5个数字中选出几个数字让他继续全排列,那么你就错了,他同样的很擅长.现在需要你写一个程序来验证擅长排列的小明到底对不对. 输入 第一行输入整数N(1<N<10)表示多少组测试数据,每组测试数据第一行两个整数 n m (1<n<9,0<m<=n) 输出 在1-n中选取

擅长排列的小明II

先搜索 出来一点结果之后  看结果之间的 联系 得出  递推公式  . 1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<iostream> 5 #include<limits.h> 6 #include<algorithm> 7 #include<queue> 8 #include<vector> 9 #include

擅长排列的小明

擅长排列的小明 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 小明十分聪明,而且十分擅长排列计算.比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想为难他,在这5个数字中选出几个数字让他继续全排列,那么你就错了,他同样的很擅长.现在需要你写一个程序来验证擅长排列的小明到底对不对. 输入 第一行输入整数N(1<N<10)表示多少组测试数据, 每组测试数据第一行两个整数 n m (1<n<9,0<m<=n) 输出 在1-n中选