[BZOJ1002]轮状病毒 做题笔记

来源:互联网 发布:淘宝开学季活动策划 编辑:程序博客网 时间:2024/05/23 01:25

·· / ·– ·· ·-·· ·-·· / ·–· · ·-· ··· ·· ··· - / ··- -· - ·· ·-·· / ·· / ·– ·· -·
题目来源:http://www.lydsy.com/JudgeOnline/problem.php?id=1002
这题我还是直接放一下题解链接吧,感觉这个DP真心想不到。
http://www.lydsy.com/JudgeOnline/wttl/thread.php?tid=419

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;struct bign {    int s[300],len;    bign operator = (const int x) {        len=0;s[0]=0;int num=x;        if (!num) len=1,s[0]=0;        else for (;num;s[len++]=num%10,num/=10);        return *this;    }    bign operator + (const bign& b) const {        bign c; c.len=0;        for (int i=0,g=0;g||i<max(len,b.len);i++) {            int x=g;            if (i<len) x+=s[i];            if (i<b.len) x+=b.s[i];            c.s[c.len++]=x%10;            g=x/10;        }        return c;    }};bign f[200][3];bign ans;int n;int main () {    scanf("%d",&n);    ans=-2;    f[1][0]=1;f[1][1]=0;f[1][2]=0;    for (int i=2;i<=n;i++) {        f[i][0]=f[i-1][0]+f[i-1][1];        f[i][1]=f[i][2]=f[i-1][0]+f[i-1][1]+f[i-1][2];    }    ans=ans+f[n][0]+f[n][1];    f[1][0]=0;f[1][1]=1;f[1][2]=1;    for (int i=2;i<=n;i++) {        f[i][0]=f[i-1][0]+f[i-1][1];        f[i][1]=f[i][2]=f[i-1][0]+f[i-1][1]+f[i-1][2];    }    ans=ans+f[n][0]+f[n][1]+f[n][2];    for (int i=ans.len-1;i>=0;i--) printf("%d",ans.s[i]); }
0 0
原创粉丝点击