九度oj 题目1552:座位问题

题目描述:

计算机学院的男生和女生共n个人要坐成一排玩游戏,因为计算机的女生都非常害羞,男生又很主动,所以活动的组织者要求在任何时候,一个女生的左边或者右边至少有一个女生,即每个女生均不会只与男生相邻。现在活动的组织者想知道,共有多少种可选的座位方案。


例如当n为4时,共有
女女女女, 女女女男, 男女女女, 女女男男, 男女女男, 男男女女, 男男男男
7种。

输入:

输入包含多组测试用例,每组测试用例仅包含一个整数n(1<=n<=1000)。

输出:

对于每组测试用例,输出一个数代表可选的方案数,为防止答案过大,答案对1000000007取模。

样例输入:
1
2
4
样例输出:
1
2
7

dp[i][0]表示有i个座位并且最后一个人是女生的情况数
dp[i][0]表示有i个座位并且最后一个人是男生的情况数

代码如下:
 1 #include <cstdio>
 2 #define M 1000000007
 3 int dp[1010][2];
 4 
 5 int main(int argc, char const *argv[])
 6 {
 7     dp[1][0] = 0;
 8     dp[1][1] = 1;
 9     dp[2][0] = 1;
10     dp[2][1] = 1;
11     for(int i = 3; i <= 1000; i++) {
12         dp[i][0] = (dp[i-1][0] + dp[i-2][1])%M;
13         dp[i][1] = (dp[i-1][0] + dp[i-1][1])%M;
14     }    
15     int n;
16     while(scanf("%d",&n) != EOF) {
17         printf("%d
",(dp[n][0] + dp[n][1])%M);
18     }
19     return 0;
20 }

第一次提交错误,代码如下

 1 #include <cstdio>
 2 #define M 1000000007
 3 int dp[1010][2];
 4  
 5 int main(int argc, char const *argv[])
 6 {
 7     dp[1][0] = 0;
 8     dp[1][1] = 1;
 9     dp[2][0] = 1;
10     dp[2][1] = 1;
11     for(int i = 3; i <= 1000; i++) {
12         dp[i][0] = (dp[i-1][0] + dp[i-2][1])%M;
13         dp[i][1] = (dp[i-1][0] + dp[i-1][1])%M;
14     }   
15     int n;
16     while(scanf("%d",&n) != EOF) {
17         printf("%d
",dp[n][0] + dp[n][1]);
18     }
19     return 0;
20 }

原因在第17行没有对和%M



原文地址:https://www.cnblogs.com/jasonJie/p/5883347.html