poj 1953 World Cup Noise(DP)

来源:互联网 发布:前台数据传到msql乱码 编辑:程序博客网 时间:2024/06/05 11:51

题意不是很容易读懂,大意是这样的:

给一个n位的二进制数,求它有多少种不包含连续的一的排列,例如 n = 3时,有5种排列 ( 000, 001, 010, 100, 101)(011, 110, 111 中有连续的1所以不满足).。

思路:

我们先填n位二进制数的第一位,第一位有两种情况,1或0,当第一位为0时,这个n位数的排列数与其后的n-1位排列数相同,当第一位为1时,第二位一定为0(因为不能有连续的1),所以这个n位数的排列,与其后n-2 位数排列相同

所以我们可以得到一个公式 f(n)=f(n-1)+f(n-2)。即斐波拉契数列

有了这个公式我们很容易得到程序。不过需要注意的是,这道题用递归的方法会超时

代码:

#include<iostream>#include<stdio.h>#include<string.h>using namespace std;int f[50];int main(){int t,x;f[1]=2;f[2]=3;for(int i=3;i<50;i++){f[i]=f[i-1]+f[i-2];}cin>>t;for(int i=1;i<=t;i++){scanf("%d",&x);printf("Scenario #%d:\n%d\n\n",i,f[x]);}return 0;} 


0 0
原创粉丝点击