zhber
有好多做过的题没写下来,如果我还能记得就补吧

 给定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("\n");
}
int main()
{
    while(scanf("%d", &N) == 1)
    {
        init();
        solve();
    }
    return 0;
}


posted on 2014-06-01 23:21  zhber  阅读(119)  评论(0编辑  收藏  举报