题目大意: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; }