题解 P2039 [AHOI2009]跳棋

· · 题解

考虑到所有偶数点都有棋子那么一定能跳到最右边。

第一问

考虑三种情况:

累加这几种情况的答案即可。

第二问

如果只有一个情况为第一种情况,可以暴力更新。

否则,求这个点被跳到的最小代价。发现第一种情况的代价是斐波那契数列,从左至右从右至左各更新一次即可。

时间复杂度 O(n)

```cpp const int N = 1005; int n, x, cnt; ll dp[N]; ll inf, sum; int main() { memset(dp, 0x3f, sizeof dp); inf = dp[1]; qread(n, x); rep(i, 2, n) { // for(int i = 2; i <= n; i++) qread(x); if(x) dp[i] = 1; } rep(i, 2, n) To_min(dp[i], dp[i - 1] + dp[i - 2]); per(i, n, 2) To_min(dp[i], dp[i + 1] + dp[i + 2]); // for(int i = n; i >= 2; i--) for(int i = 2; i <= n; i += 2) dp[i] == inf ? ++cnt : sum += dp[i]; printf("%d\n%lld\n", cnt, sum); return 0; } ```