Problem Description
度熊面前有一个全是由1构成的字符串,被称为全1序列。你可以合并任意相邻的两个1,从而形成一个新的序列。对于给定的一个全1序列,请计算根据以上方法,可以构成多少种不同的序列。
Input
这里包括多组测试数据,每组测试数据包含一个正整数N,代表全1序列的长度。
1≤N≤200
Output
对于每组测试数据,输出一个整数,代表由题目中所给定的全1序列所能形成的新序列的数量。
Sample Input
1
3
5
Sample Output
1
3
8
Hint
如果序列是:(111)。可以构造出如下三个新序列:(111), (21), (12)。
度熊面前有一个全是由1构成的字符串,被称为全1序列。你可以合并任意相邻的两个1,从而形成一个新的序列。对于给定的一个全1序列,请计算根据以上方法,可以构成多少种不同的序列。
Input
这里包括多组测试数据,每组测试数据包含一个正整数N,代表全1序列的长度。
1≤N≤200
Output
对于每组测试数据,输出一个整数,代表由题目中所给定的全1序列所能形成的新序列的数量。
Sample Input
1
3
5
Sample Output
1
3
8
Hint
如果序列是:(111)。可以构造出如下三个新序列:(111), (21), (12)。
思路:简单的想法 加一个1要么与前一个1组合成2 就有 d[i-2]种, 要么不组合就有 d[i-1]种。 然后就是大数相加这里麻烦点。
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
#define siz 300
using namespace std;
char s[siz][siz];
void jia(char *s,char a[],char b[]){//用字符串
int ix,iy,ji,l;
ix=strlen(a)-1, iy=strlen(b)-1;
ji=l=0;
while(ix>=0||iy>=0){
int x1,x2,n;
x1=x2=0;
if(ix>=0){
x1=a[ix]-'0';
ix--;
}
if(iy>=0){
x2=b[iy]-'0';
iy--;
}
n=(x1+x2+ji)%10;
ji=(x1+x2+ji)/10;
s[l++]=n+'0';
}
if(ji) s[l++]=ji+'0';
for(int i=0;i<l/2;i++){
char t;
t=s[i];
s[i]=s[l-i-1];
s[l-i-1]=t;
}
s[l]='\0';
}
void fact(){
strcpy(s[1],"1");
strcpy(s[2],"2");
for(int i=3;i<=200;i++){
jia(s[i],s[i-1],s[i-2]);
}
}
int main()
{
int n;
fact();
while(scanf("%d",&n)!=EOF){
cout<<s[n]<<endl;
}
return 0;
}
用数组实现两个非负大数相加:
void init()
{
memset(d,0,sizeof(d));
d[1][1000]=1;
d[2][1000]=2;
for(int i=3;i<205;i++)
{
for(int j=1000;j>=0;j--)
{
d[i][j]+=d[i-1][j]+d[i-2][j];
if(d[i][j]>=10)d[i][j]-=10,d[i][j-1]+=1;;
}
}
}