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 }
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 }