http://acm.hdu.edu.cn/showproblem.php?pid=4148
此题的规律就是……
s(1)=1
s(2)=11 (表示s(1)有1个1)
s(3)=21(表示s(2)有2个1)
s(4)=1211(表示s(3)有1个2,1个1)
……
#include <iostream>
#include <string>
using namespace std;
#define N 31
string s[N];
void init(){ //初始化,按规律写出30个串。
s[0]="1";
int i,j,k;
char c;
for (i=1;i<N;i++){
s[i]="";
c=s[i-1][0]; //表示数字
k=1; //统计个数
for (j=1;j<s[i-1].length();j++){
if (c!=s[i-1][j]){ //遇到不一样的数字时就添加
s[i].append(1,k+48); //先将个数加进去
s[i].append(1,c); //再加数字
k=1;
c=s[i-1][j];
}
else k++; //一样时,个数加加。
}
s[i].append(1,k+48);
s[i].append(1,c);
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("Fin.txt","r",stdin);
#endif
int n;
init();
while (scanf("%d",&n)!=EOF&&n)
printf("%d\n",s[n-1].length());
return 0;
}
本文介绍了一个有趣的递归序列生成算法,该算法用于解决HDU 4148题目。通过分析序列规律,使用C++实现了一个能够快速生成指定位置的序列字符串,并计算其长度的程序。
2626

被折叠的 条评论
为什么被折叠?



