//hdu 1041 Computer Transformation(大数递推) /* 题意:给你一个序列 1; step1之后序列变:01 step2之后序列变:1001 step3之后序列变:01101001 。。。。。 求:讲过n个step之后:有几个连续2为0的数 解题: 经分析:递推(dp[][0]为几个连续2为0的数,dp[][1]为几个连续2为1的数,) n为奇数时: dp[n][0]=dp[n-1][1]+dp[n-1][0]; dp[n][1]=dp[n-1][1]+dp[n-1][0]; n为偶数时: dp[n][0]=dp[n-1][1]+dp[n-1][0]+1; dp[n][1]=dp[n-1][1]+dp[n-1][0]; (注意的是要大数) */ #include<iostream> #include<cstdio> using namespace std; const int N=1010; struct node { int num[500]; int len; node(){len=0;} }dp[N][2]; node operator +(node a,node b)//两个大数相加; { node sum; int len1=a.len<b.len?a.len:b.len; sum.len=a.len>b.len?a.len:b.len; int w,v=0; for(int i=0;i<len1;i++) { w=a.num[i]+b.num[i]+v; sum.num[i]=w%10; v=w/10; } for(int i=len1;i<a.len;i++) { w=a.num[i]+v; sum.num[i]=w%10; v=w/10; } for(int i=len1;i<b.len;i++) { w=b.num[i]+v; sum.num[i]=w%10; v=w/10; } if(v!=0) { sum.num[sum.len]=v; sum.len++; } return sum; } void init()//递推枚举1到1000 { dp[0][0].num[0]=0; dp[0][1].num[0]=0; dp[0][0].len=1; dp[0][1].len=1; node temp; temp.num[0]=1; temp.len=1; for(int i=1;i<=1000;i++) { if(i%2==1) { dp[i][0]=dp[i-1][0]+dp[i-1][1]; dp[i][1]=dp[i-1][0]+dp[i-1][1]; } else { dp[i][0]=dp[i-1][0]+dp[i-1][1]+temp; dp[i][1]=dp[i-1][0]+dp[i-1][1]; } } } void print(int j)//输出一个大数 { for(int i=dp[j][0].len-1;i>=0;i--) { printf("%d",dp[j][0].num[i]); } printf("\n"); } int main() { init(); int n; while(scanf("%d",&n)!=EOF) { print(n); } return 0; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。