快饿死的XzzF (暴力枚举法 && DP背包法 && 找规律数学法)

 

 

 第一种方法   BF (暴力枚举):刚好这题数据范围不大

int main(){
    int n, max, count = 0;
    scanf("%d", &n);
    max = 1 << n;  //相当于max = 2的n次方,这里运用了位运算,<<(左移)一次相当于乘2
    for(int i = 0; i < max; i++){
        int j = i; //对当前数字做位运算,用j代替i
        int k = n; //位运算次数,位运算次数就是 几位数,即长度(你输入的n)
        int ok = 2;//类似于标志变量,用于检测有没有连续的0 因为当有两个连续的0时 不符合所以取个2
        whlie(ok && k--){       //  && 是 有一个为假全假,所以未遇到连续的0,位运算次数用不完
            if(j%2 == 1){       //遇到1重新设为2;
                ok = 2;
            }
            else{
                ok--;           //遇到0,减一
            }
            j>>=1;              //位运算处理
       }
        count += !!ok;          //如果没有出现连续的0,计数器加一
       }                        //小技巧(!!ok)可以将所有不是零的数转变成1
        printf("%d", count);
    return 0;
}

数学法(找规律)

简单算算可以得知结果应该是    2  3  5  8  13......

其实是一个简单的斐波那契数列(后一项等于前两项之和)所以我们写一个斐波那契数列函数就行

#include <stdio.h>
#include <stdlib.h>

int fib(int n){
    int a;
    if( n == 1){
        return 2;
    }
    if( n == 2){
        return 3;
    }
    if( n > 2){
        a = fib(n-1) + fib(n-2);
        return a;
    }
    return 0;
}

int main()
{
    int n;
    int a;
    scanf("%d",&n);
    a = fib(n);
    printf("%d",a);
    return 0;
}

第三种:DP背包

DP就是把一个大的问题化成一堆相同的小问题,当你解决了小问题之后,可以一步步推出大问题的结果,(有点像那啥哈哈)

好,让我们开始思考一下

当长度为一时有 {0}  {1}  这两种情况

当长度为二的时候0前面只能是1,而1 前面无论是谁都可以

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n;
    int dp[25][2];//因为第二维只放0或1所以不开那么大
    dp[1][0] = dp[1][1] = 1; //一维代表长度,当为0或者1时显然符合题意的是一种
    scanf("%d",&n);
    for(int i = 2; i <= n; i++){
        dp[i][0] = dp[i-1][1]; //若为零,则前面放的数只能是一
        dp[i][1] = dp[i-1][1] + dp[i-1][0];//若为1,前面可以放一又可以 放零
    }
    printf("%d",dp[n][0] + dp[n][1]);  //都是合理结果相加后输出
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值