poj1953 World Cup Noise [1]

本文针对POJ1953问题提供了一种有效的解决方案,通过观察规律发现该问题与斐波那契数列相关,并给出了两种实现方式:一种是递归方式但存在超时风险;另一种是使用数组预计算所有可能结果,有效避免了超时问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

poj1953 World Cup Noise [1]


题目链接

(1)ac代码

/*
题意:
给一个n(n<45),用0/1组成一个长度为n的串,问没有相邻的1的串有多少?
例如:
n = 3时,000, 001, 010, 100, 101是可以的,而011, 110, 111不行。
我的做法:
n<45,有点懵,然后列出n=1~5的结果一看,发现是Fibonacci数列。
1   2
2   3
3   5
4   8
5   13
...
*/

#include <stdio.h>

int
main() {
    int n, k, i;
    int ans[50] = {1, 2, 3};

    for( i = 3; i < 45; i++ ) {
        ans[i] = ans[i - 1] + ans[i - 2];
    }
    scanf("%d", &n);
    for( i = 1; i <= n; i++ ) {
        scanf("%d", &k);
        printf("Scenario #%d:\n%d\n\n", i, ans[k]);
    }

    return 0;
}

(2)最初版本,递归超时

#include <stdio.h>

int
f(int n) {
    if( n == 1 ) {
        return 2;
    }
    if( n == 2 ) {
        return 3;
    }
    return f(n - 1) + f(n - 2);
}

int
main() {
    int n, k, i, ans;

    scanf("%d", &n);
    for( i = 1; i <= n; i++ ) {
        scanf("%d", &k);
        ans = f(k);
        printf("Scenario #%d:\n%d\n\n", i, ans);
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值