九度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 }