zoukankan      html  css  js  c++  java
  • 无相邻1问题

    无相邻1问题

    问题描述:

    123可构作n位数,计算其中没有相邻的1出现的个数。

    输入:

    输入文件中有若干行。每一行上有一个正整数n作为一个测试数据,(1<=n<=100)。

    输入直到文件结束。

    输出:

    对输入文件中的每个测试数据,在输出文件输出没有相邻的1出现的n位数的个数。

    输入样例:

    3

    4

    1

     

    输出样例

    22

    60

    3

     

    分析:设 f[n]为符合条件的n位数的个数,则 f[n]=2f[n-1]+2f[n-2];

     

    #include<stdio.h>
    #include<iostream>
    #define MAXN 100
    using namespace std;
    
    char a[100][100];
    //高精度加法 
    void add(char a[],char b[],char back[])
    {
        int i,j,k,up,x,y,z,l;
        char *c;
        if (strlen(a)>strlen(b)) l=strlen(a)+2; else l=strlen(b)+2;
              c=(char *) malloc(l*sizeof(char));
        i=strlen(a)-1;
        j=strlen(b)-1;
        k=0;up=0;
        while(i>=0||j>=0)
        {
            if(i<0) x='0'; else x=a[i];
            if(j<0) y='0'; else y=b[j];
            z=x-'0'+y-'0';
            if(up) z+=1;
            if(z>9) {up=1;z%=10;} else up=0;
            c[k++]=z+'0';
            i--;j--;
        }
        if(up) c[k++]='1';
        i=0;
        c[k]='\0';
        for(k-=1;k>=0;k--)
        back[i++]=c[k];
        back[i]='\0';
    } 
    //打表,数据大,用高精度算的 
    void test()
    {
        a[1][0]='3';a[1][1]='\0';
        a[2][0]='8';a[2][1]='\0';
        for(int i=3;i<=MAXN;i++)
        {
            add(a[i-1],a[i-2],a[i]);
            add(a[i-1],a[i],a[i]);
            add(a[i-2],a[i],a[i]);
        }    
    }    
    int main()
    {
        int n;
        test();
        while(scanf("%d",&n)!=EOF)
        {
            printf("%s\n",a[n]);
        }  
        return 0;  
    }    
    
  • 相关阅读:
    I Hate It HDU
    线段树为什么要开4倍空间
    敌兵布阵 HDU
    线段树 模板
    线段树原理详解
    HDU5037 Frog
    HDU5187 zhx's contest
    HDU5307 He is Flying
    UOJ#34. 多项式乘法
    Bzoj4766 文艺计算姬
  • 原文地址:https://www.cnblogs.com/kuangbin/p/2114425.html
Copyright © 2011-2022 走看看