您的位置:首页 > 其它

(NYoj 469)擅长排列的小明 II --简单地推规律,打表思想

2016-08-05 20:36 323 查看
擅长排列的小明 II

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

难度:3

描述

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

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

1、第一个数必须是1

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

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

输入

多组数据。每组数据中输入一个正整数n(n<=55).

输出

输出种数。

样例输入

4

样例输出

4

来源

Ural

上传者

李文鑫

分析:

拿到这一题我就在找d[i]和前面的d之间的关系,发现d[i]和d[i-1],d[i-3]有关系。但是却推不出大难那。“尴尬了。。”

后来为了节约时间我就直接想到了打表的方法。先用一个程序跑出所有的结果,然后在直接输出即可。

这是打表的代码:

//打表法
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

bool used[60];
int n,cnt;

void dfs(int cur,int pre)
{
if(cur>n)
{
cnt++;return;
}
int i=pre-2,j=pre+2;
for(i;i<=j && i<=n;i++)
{
if(i>=1 && !used[i])
{
used[i]=true;
dfs(cur+1,i);
used[i]=false;
}
}
}

int main()
{
printf("1,");
for(n=2;n<=55;n++)
{
cnt=0;
memset(used,false,sizeof(false));
used[1]=true;
dfs(2,1);
printf("%d,",cnt);
}
return 0;
}


其实在很多时候,特别是在比赛中,直接打表就好,在等待的过程中就直接去做下一题就好。

由于是深搜所以好一点时间,然后我就开始找规律了。

d[i]=d[i-1]+d[i-3]+1;

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int ans[60];

int main()
{
ans[0]=0;ans[1]=1;ans[2]=1;ans[3]=2;ans[4]=4;
for(int i=5;i<=55;i++)
ans[i]=ans[i-1]+ans[i-3]+1;
int n;
while(scanf("%d",&n)!=EOF)
{
printf("%d\n",ans
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: