九度 1552:座位问题(二维DP)
总结:
1. dp[i][0] 第 i 个位置上座男生方案数, dp[i][1] 第 i 个位置上座女生方案数
2. dp[i][0] = dp[i-1][0] + dp[i-1][1], straight forward
3. dp[i][0] = dp[i-2][0] + dp[i-3][0] +... dp[0][0] 枚举第一个男生出现的位置, 出现该男生之前的位子上座的都是女生
代码
/* * source.cpp * * Created on: 2014-4-4 * Author: vincent */ #include <iostream> #include <stdio.h> #include <math.h> using namespace std; int cal(int n) { int dp[1010][2]; int dpsum[1010]; // dpsum[i] = dp[i][1] + dp[i-1][1]... dp[0][0] = 0; dp[1][0] = 1; dp[0][1] = 0; dp[1][1] = 0; dpsum[0] = 1; dpsum[1] = 2; for(int i = 2; i <= n; i ++) { dp[i][0] = dp[i-1][0] + dp[i-1][1]; dp[i][0] %= 1000000007; dpsum[i] = dpsum[i-1]+dp[i][0]; dpsum[i] %= 1000000007; dp[i][1] = dpsum[i-2]; dp[i][1] %= 1000000007; } return (dp[n][0] + dp[n][1])%1000000007; } int main() { freopen("input.txt", "r", stdin); int n; while(scanf("%d", &n) != EOF) { printf("%d\n", cal(n)); } return 0; }