zoukankan      html  css  js  c++  java
  • bzoj1002[FJOI2007]轮状病毒

     给定n(N<=100),编程计算有多少个不同的n轮状病毒。

    Input

    第一行有1个正整数n。

    Output

    将编程计算出的不同的n轮状病毒数输出

    Sample Input

    3

    Sample Output

    16

    神dp。如果没看题解真心想不出来

    #include<stdio.h>
    #include<string.h>
    #define MAXD 110
    int N;
    struct BigInteger
    {
        char a[MAXD];
        const static int D = 100;
        void init(int n)
        {
            int i;
            for(i = 0; i < D; i ++)
            {
                a[i] = n % 10;
                n /= 10;
            }
        }
        BigInteger add(BigInteger &b)
        {
            int i, s, c;
            BigInteger ans;
            c = 0;
            for(i = 0; i < D; i ++)
            {
                s = a[i] + b.a[i] + c;
                ans.a[i] = s % 10;
                c = s / 10;
            }
            return ans;
        }
        BigInteger minus(BigInteger &b)
        {
            int i, s, c;
            BigInteger ans;
            c = 0;
            for(i = 0; i < D; i ++)
            {
                s = a[i] + c;
                if(s >= b.a[i])
                {
                    ans.a[i] = s - b.a[i];
                    c = 0;
                }
                else
                {
                    c = -1;
                    ans.a[i] = s + 10 - b.a[i];
                }
            }
            return ans;
        }
        void print()
        {
            int i;
            for(i = D - 1; i > 0 && a[i] == 0; i --);
            for(; i >= 0; i --)
                printf("%d", a[i]);
        }
    }f[MAXD], h[MAXD], g[MAXD];
    void init()
    {
        f[1].init(0), g[1].init(1), h[1].init(1);
        f[2].init(3), g[2].init(2), h[2].init(3);
    }
    void solve()
    {
        int i;
        for(i = 3; i <= N; i ++)
        {
            f[i] = f[i - 1].add(f[i - 1]).add(h[i - 1]).minus(h[i - 2]);
            g[i] = f[i - 1].add(g[i - 1]).add(h[i - 1]);
            h[i] = f[i - 1].add(h[i - 1]).add(h[i - 1]).minus(h[i - 2]);
        }
        f[N].add(g[N]).print();
        printf("
    ");
    }
    int main()
    {
        while(scanf("%d", &N) == 1)
        {
            init();
            solve();
        }
        return 0;
    }


    ——by zhber,转载请注明来源
  • 相关阅读:
    如何修炼成某一领域的高手?
    宝宝为什么见生人就哭
    绩效管理
    《管理3.0》读书笔记
    卡特尔16PF性格测试与答案
    管理3.0
    偶感
    Javascript事件总结
    HTML5中与页面显示相关的API
    毕业了五年了--- 人生感想
  • 原文地址:https://www.cnblogs.com/zhber/p/4036125.html
Copyright © 2011-2022 走看看