九度OJ 1552座位问题(dp)

刚开始写的一维数组,但是由于后面的数字较大,要对它取模,所以用一维数组进行减法运算,结果就不对了。所以还是得用二维数组,用dp[n][0]来表示第n位为男生总的方法个数,dp[n][1]表示第n位为女生总方法个数。那么男生的状态转移方程为dp[n][0] = dp[n - 1][0] + dp[n - 1][1]; 意思就是只要最后一位放男生的话,不管前面是什么都可以放的,都满足题目给的那个条件,女生的状态转移方程为dp[n][1] = dp[n - 1][1] + dp[n - 2][0]; 意思是当第n位放女生的时候,那么第n-1位一定是女生才满足条件,所以要加上n-1位的女生个数,但是有一种情况dp[n-1][1]里面没有包含,就是 “....男女”这种情况,因为这种情况在dp[n-1][1]的时候是不满足要求的,那么再加上这个少的,所以要加n-2的男生。初始化数据的时候小心点就行了。关键是仔细读题!

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 
 5 using namespace std;
 6 const int N = 1005;
 7 const long long mod = 1000000007;
 8 long long dp[N][2];//dp[i][0]表示第i个位置排男生的总方法数
 9 int main()
10 {
11     int n;
12     memset(dp, 0, sizeof(dp));
13     dp[1][0] = 1;//男生 
14     dp[1][1] = 0;//女生
15     dp[2][0] = 1;
16     dp[2][1] = 1;
17     dp[3][0] = 2;
18     dp[3][1] = 2;
19     for (int i = 4; i < N; i++)
20     {
21         dp[i][0] = dp[i - 1][0] + dp[i - 1][1];
22         dp[i][0] %= mod;
23         dp[i][1] = dp[i - 1][1] + dp[i - 2][0];
24         dp[i][1] %= mod;
25     }
26     while (~scanf("%d", &n))
27     {
28         
29         printf("%lld\n", (dp[n][0] + dp[n][1]) % mod);
30     }    
31     return 0;
32 }

 

posted @ 2015-03-14 13:16  Howe_Young  阅读(229)  评论(0编辑  收藏  举报