1. 程式人生 > >HDU-1297-Children’s Queue

HDU-1297-Children’s Queue

length %d nbsp names lan int () 2個 ren

Children’s Queue

這道題是排序問題,可以用遞歸方法解決。

計算F(n):

一:當最後一個是男孩M時候,前面n-1個隨便排出來,只要符合規則就可以,即是F(n-1);

二:當最後一個是女孩F時候,第n-1個肯定是女孩F,這時候又有兩種情況:

1)前面n-2個可以按n-2個的時候的規則來,完全可以,即是F(n-2);

2)但是即使前面n-2個人不是合法的隊列,加上兩個女生也有可能是合法的。當第n-2是女孩而n-3是男孩的情況,可能合法,情況總數為F(n-4);

綜上所述:總數F(n)=F(n-1)+F(n-2)+F(n-4);並且,F(0)=1,F(1)=1,F(2)=2,F(3)=4。

 1 #include<iostream>
 2 #include<string> 
 3 using namespace std;
 4 string add(string s1,string s2)
 5 {
 6     
 7     int j,l,la,lb;
 8     string max,min;
 9     max=s1;min=s2;
10     if(s1.length()<s2.length()) {max=s2;min=s1;}
11     la=max.size();lb=min.size();
12     l=la-1;
13 for(j=lb-1;j>=0;j--,l--) max[l] += min[j]-0; 14 for(j=la-1;j>=1;j--) if(max[j]>9){max[j]-=10;max[j-1]++;} 15 if(max[0]>9) {max[0]-=10;max=1+max;} 16 return max; 17 } 18 int main(){ 19 int n,i; 20 string a[1001]; 21 a[0]="1"; 22 a[1]="1"; 23 a[2]="2";
24 a[3]="4"; 25 for(i=4;i<1001;++i) 26 a[i]=add(add(a[i-1],a[i-2]),a[i-4]); 27 while(scanf("%d",&n)!=EOF) 28 cout<<a[n]<<endl; 29 return 0; 30 }

HDU-1297-Children’s Queue