HDU-1297-Children’s Queue
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 }
注:转载请注明出处