bzoj1002[FJOI2007]轮状病毒

来源:互联网 发布:淘宝网店男装代理 编辑:程序博客网 时间:2024/04/27 21:15

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

Input

第一行有1个正整数n。

Output

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

Sample Input

3

Sample Output

16

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

#include<stdio.h>#include<string.h>#define MAXD 110int 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;}


0 0
原创粉丝点击