动态规划-排列组合

题目1552:座位问题
时间限制:1 秒内存限制:128 兆特殊判题:否提交:313

解决:95
题目描述:
计算机学院的男生和女生共n个人要坐成一排玩游戏,因为计算机的女生都非常害羞,男生又很主动,所以活动的组织者要求在任何时候,一个女生的左边或者右边至少有一个女生,即每个女生均不会只与男生相邻。现在活动的组织者想知道,共有多少种可选的座位方案。例如当n为4时,共有
女女女女, 女女女男, 男女女女, 女女男男, 男女女男, 男男女女, 男男男男 7种。
输入:
输入包含多组测试用例,每组测试用例仅包含一个整数n(1<=n<=1000)。
输出:
对于每组测试用例,输出一个数代表可选的方案数,为防止答案过大,答案对1000000007取模。
样例输入:
1
2
4
样例输出:
1
2
7
来源:
2014年王道论坛研究生机试练习赛(三)

//jobdu-1552-ac
#include 
using namespace std;
 
#define M 1000000007
 
int f1[1001],f2[1001],f3[1001];
int n;
 
int main() {
   f1[1] = 1;f1[2] = 1;
   f2[2] = 1;
   f3[2] = 1;
     
    for(int i=3; i<=1000; i++) {
        f1[i] = (f1[i-1] + f3[i-1]) % M;
        f2[i] = f1[i-1];
        f3[i] = (f2[i-1] + f3[i-1]) % M;
    }
    while(cin >> n)  
	  cout << (f1[n] + f3[n])%M << endl;
     
}
/*
分三种情况讨论结尾的情况:
以一个男生结尾,以男-女结尾,以女-女结尾,分别称为第1,2,3种情况
可以看出,第1种情况由第1、3种情况加一个男生得到
第2种情况只能由第1种情况加一个女生得到
第3种情况由第2种和第三种情况加一个女生得到*/
    原文作者:动态规划
    原文地址: https://blog.csdn.net/chuchus/article/details/21076453
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞