ACM的一道问题。。。

火车沿途也不是所有站台都停靠,偶尔也是会跳过一些小站的。可以跳过一些小站,但是绝对不能连续跳过两站及以上,否则又要成为众矢之的了。现在,某条线上一共有m个站台(火车初始停... 火车沿途也不是所有站台都停靠,偶尔也是会跳过一些小站的。可以跳过一些小站,但是绝对不能连续跳过两站及以上,否则又要成为众矢之的了。现在,某条线上一共有m个站台(火车初始停靠在第一站),想知道一共有多少种停站方案可供选择,你能解决这个问题吗?
Input
输入数据首先包含一个整数N(N<=40),表示测试实例的个数,然后是N行数据,每行包含一个整数M(2<=M<=40),表示该线站台的数量。
Output
每组输出仅有一行,包含一个整数,表示可供选择的方案数。
Sample Input
2
2
3Sample Output
12
HINT
样例说明:
第一个2表示n为2,即一共有两组数据(实际测试数据不止两组);
第二个2表示第一组数据m为2,即一共有两站,而火车初始停靠在第一站,所以只有一种方案;
最后的3表示第二组数据m为3,即一共有三站,火车可以先开到第二站再到第三站,也可以直接开到第三站,所以有两种方案。
展开
 我来答
夜神月YOONA
2013-03-12 · TA获得超过339个赞
知道小有建树答主
回答量:219
采纳率:0%
帮助的人:254万
展开全部
典型的斐波那契数列,有2中方法。
迭代:
#include <iostream>
using std::cin;using std::cout;
using std::endl;

int main(){
int n(0), m(0);
cin>>n;
while(n>0)
{
int feb[2]={1,1};
cin>>m;
if(2==m)cout<<1<<endl;
else if(m>2)
{
for(int i(2);i<m;++i)
{
int tmp(feb[1]);
feb[1]+=feb[0];
feb[0]=tmp;
}
cout<<feb[1]<<endl;
}
--n;
}
}

递归:
#include <iostream>
using std::cin;using std::cout;
using std::endl;

int feb(const int &n)
{
if(2==n||1==n)return 1;
else if(n>2)
{
return feb(n-1)+feb(n-2);
}
return 0;
}
int main()
{
int n(0), m(0);
cin>>n;
while(n>0)
{
cin>>m;
cout<<feb(m)<<endl;
--n;
}
return 0;
}
追问
写上注释行么,我想用二进制数字做,貌似c  不能定义二进制数字。。。这道题数学上是怎么解释的,原理是什么
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
pfzq303
2013-03-12 · TA获得超过172个赞
知道答主
回答量:98
采纳率:0%
帮助的人:42万
展开全部
很简单的动态规划。
dp[i]表示第i个站有多少种方案。
则有:
dp[1]=dp[2]=1;
dp[i]=dp[i-1]+dp[i-2];
以此类推
追问
为什么,不理解呀,
追答
很容易理解
第i个站只有两种到达方案
一是在i-1个站然后过了一个站停下的,这时候方案数就是第i-1个站的方案数。
二是第i-2过了两个站停下的,这时候方案数就是第i-2个站的方案数。
所以第i个站的方案数就是
第i-1个站的方案数 + 第i-2个站的方案数
我为了简便用了dp[i]表示第i个站有多少种方案
第一个站和第二个站的方案数显然都是1
则是:dp[1]=dp[2]=1;
后面的站就可以根据前面讲的理由去递推了
即:dp[i]=dp[i-1]+dp[i-2];
懂了么
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式