HDU4148(字符串)

解题思路:看过题就知道是要找规律的,而从下列式子中不容易发现,

                       S(1)=1,           //在s(n)从左往右看
                       S(2)=11,          s(1)中有1个1;
                       S(3)=21,          s(2)中有2个1;
                       S(4)=1211,       s(3)中有1个2和1个1;
                       S(5)=111221,   s(4)中有1个1、1个2和2个1;
                       S(6)=312211,   s(5)中有3个1、2个2和1个1;
                       ……

让求s(n)的长度,首先必须找出 s(n)的组成结构,其实仔细一看,会发现s(n)的组成是跟 s(n-1) 密切相关的,过程如上所述。由于 n<=30,数据不大,我就定义了一个二维字符数组来保存s(n)的所有信息,然后就可以求出所需长度。

View Code
 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 using namespace std;
 5 
 6 char s[31][10000];
 7 int main()
 8 {
 9     int n,i,j,len;
10     s[1][0]='1';
11     s[1][2]='\0';
12     for(i=2;i<31;i++)
13     {
14         len=strlen(s[i-1]);
15         int sum=1,k=0;
16         for(j=0;j<len;j++)
17            if(s[i-1][j+1]==s[i-1][j]) sum++;
18            else
19            {
20                s[i][k]=sum+'0';
21                k++;
22                s[i][k]=s[i-1][j];
23                k++;
24                sum=1;
25            }
26            s[i][k]='\0';
27     }
28     while(cin>>n&&n)
29     {
30         len=strlen(s[n]);
31         cout<<len<<endl;
32     }
33     return 0;
34 }


 

posted @ 2012-03-21 09:20  笑巧  阅读(486)  评论(0编辑  收藏  举报