- 题目描述:
-
计算机学院的男生和女生共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