DP BestCoder Round #50 (div.2) 1003 The mook jong

时间:2023-03-10 03:25:27
DP BestCoder Round #50 (div.2) 1003 The mook jong

题目传送门

 /*
DP:这题赤裸裸的dp,dp[i][1/0]表示第i块板放木桩和不放木桩的方案数。状态转移方程:
dp[i][1] = dp[i-3][1] + dp[i-3][0] + 1; dp[i][0] = dp[i-1][1] + dp[i-1][0];
比赛时二维dp写搓了,主要是边界情况的判断出错,比如dp[3][1] = 1,因为第3块放了木桩,其他地方不能再放,dp[3][0]同理
解释一下dp[i][1]的三种情况,可能是前面相隔2个放的方案或者是不放的方案,还有唯独在第i块放的方案(1)
比赛时瞄了一下样例,感觉有规律,就写出了dp[i] = dp[i-3] + dp[i-1] + 1;(dp[1] = 1; dp[2] = 2; dp[3] = 3;)其实都一样
*/
/************************************************
* Author :Running_Time
* Created Time :2015-8-9 8:48:32
* File Name :C_2.cpp
************************************************/ #include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <cmath>
#include <ctime>
#include <cstdlib>
#include <list> #define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int MAXN = ;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + ;
ll dp[MAXN][]; void solve(void) {
dp[][] = ; dp[][] = ;
dp[][] = ; dp[][] = ;
dp[][] = ; dp[][] = ;
for (int i=; i<=; ++i) {
dp[i][] = dp[i-][] + dp[i-][] + ;
dp[i][] = dp[i-][] + dp[i-][];
}
} int main(void) { //BestCoder Round #50 (div.2) 1003 The mook jong
solve ();
int n;
while (scanf ("%d", &n) == ) {
printf ("%I64d\n", dp[n][] + dp[n][]);
} return ;
}