您的位置:首页 > 其它

hdu 1041 Computer Transformation(大数递推)

2014-10-15 18:59 253 查看
//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
[0]=dp[n-1][1]+dp[n-1][0];
dp
[1]=dp[n-1][1]+dp[n-1][0];
n为偶数时:
dp
[0]=dp[n-1][1]+dp[n-1][0]+1;
dp
[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
[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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: