syhd142  
日历
<2010年9月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789
统计
  • 随笔 - 23
  • 文章 - 122
  • 评论 - 31
  • 引用 - 0

导航

常用链接

留言簿(2)

随笔档案(23)

文章分类(270)

文章档案(122)

我的豆瓣

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 
题意:要求出一个长度为n的二进制数种不含相邻1的个数,直接枚举不现实2^45此方。。
解法:DP递推,考虑长度为1时以0结尾和以1结尾的个数都为,长度为2时以0结尾的个数为长度为1时以0结尾的个数加上以1结尾的个数(因为在在0和1后面添加0任然满足条 件),而长度为2时以1结尾的个数就等于长度为1时以0结尾的个数(因为不能出现两个连续的1)。这样给出了边界条件和转移方程,就可以递推了。
简化之后发现其实就一个斐波那切数列。
#include <stdio.h>

#define N 45

int a[N][2];

int main()
{
    a[
1][0= a[1][1= 1;
    
for(int i = 2; i < N; i++)
    {
        a[i][
0= a[i - 1][1+ a[i - 1][0];
        a[i][
1= a[i - 1][0];
    }
    
int t, n;
    scanf(
"%d"&t);
    
for(int i = 1; i <= t; i++)
    {
        scanf(
"%d"&n);
        printf(
"Scenario #%d:\n", i);
        printf(
"%d\n\n", a[n][0+ a[n][1]);
    }
    
return 0;
}
posted on 2010-05-28 16:21 Fucker 阅读(116) 评论(0)  编辑 收藏 引用 所属分类: ACM/ICPCDP简单

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


 
Copyright © Fucker Powered by: 博客园 模板提供:沪江博客