hdu1297Children’s Queue (递推+大数)

hdu 1297 Children’s Queue

题目大意:n个学生排成一列,要求女生要么没有,要么不能单独一个女生排在一起。

思路:令f(x)表示x个学生的排列的种数。如果第n个学生是男生,那么前n-1个人只要满足条件即可,可能数为f(n-1)。

如果最后一个学生为女生,那么第n-1个学生一定也是女生,考虑前n-2个学生的情况。如果前n-2个学生的排列满足条件,当然可以。(最难得地方)如果前n-2个学生的排列不满足条件,也有使整体满足条件的可能。即:前第n-2个学生是女生,第n-3个学生是男生,最后前n-4个学生满足条件即可。综上:f(n) = f(n-1) + f(n-2)+f(n-4);

code:

#include <iostream>
#include <cstring>
#include<cstdio>
char dashu[1005][1000];
using namespace std;
void add(int a,int b){
    int len_a,len_b;
    len_a = strlen(dashu[a]);
    len_b = strlen(dashu[b]);
    int zf = 0;           //代表进位
    int i = 0;
    int ta,tb,d;             //ta,tb分别代表该位的数值  
    while(i < len_a || zf == 1){
        ta = tb = 0;
        if(i <len_a)
            ta = dashu[a][i]-'0';
        if(i < len_b){
            tb = dashu[b][i]-'0';
        }
        d = ta+tb+zf;
        d = d > 9?d-10:d;
        if(ta+tb+zf > 9){
            zf = 1;
        }
        else {
            zf = 0;
        }
        dashu[a][i] = '0' + d;
        i++;
    }
}
void printDashu(int a){
    int len = strlen(dashu[a]);
    for(int i = len-1;i >= 0;i --)
        cout << dashu[a][i];
    cout << endl;
}
int main()
{
    int n;
    dashu[1][0] = '1';
    dashu[2][0] = '2';
    dashu[3][0] = '4';
    dashu[4][0] = '7';
    for(int i = 5;i <= 1000;i ++)
    {
        strcpy(dashu[i],dashu[i-1]);
        add(i,i-2);
        add(i,i-4);
    }
    while(cin >> n){
        printDashu(n);
    }
    return 0;
}

 

posted on 2016-05-01 17:37  Tob's_the_top  阅读(614)  评论(0编辑  收藏  举报

导航