ABC270D(fake)

image
……
你家 E 比 D 水……

题意

有 $ N $ 颗石子,每次可以拿 $ A_1 $ 或 $ A_2 $ 或 …… 或 $ A_K $ 颗石子。
Takahashi 是先手,Snuke 是后手。他们都想让自己取的石子数尽可能的多。
在两人都采用最优策略的前提下,Takahashi 会拿多少颗石子?

Level 1

穿山甲:鸡汤来喽!
哔——


我:DP来喽!
哔——











Level 2

状态:$ f_i $ 为先手在 $ i $ 颗石子开局时,最终能拿多少颗石子。
友情提示:状态转移一次 $ O(n) $ 。











Level 3

$ f_i = \max \left \{ a_j + (i - a_j) - f_{i - a_j} \ | \ a_j \leq i \right \} $
含义:首先,我们取了 $ a_j $ 个。接着,后手开 $ i - a_j $ 的局。后手拿到 $ f_{i - a_j} $ 个,我们先手就拿到了 $ (i - a_j) - f_{i - a_j} $ 个。











代码

#include <bits/stdc++.h>
using namespace std;

int a[105], dp[10005];

int main() {
	int N, K;
	scanf("%d %d", &N, &K);
	for (int i = 0; i < K; i++) {
		scanf("%d", &a[i]);
	}
	dp[0] = 0, dp[1] = 1;
	for (int i = 2; i <= N; i++) {
		for (int j = 0; j < K; j++) {
			if (a[j] <= i) {
				dp[i] = max(dp[i], a[j] + (i - a[j] - dp[i - a[j]]));
			}
		}
	}
	printf("%d", dp[N]);
	return 0;
}
posted @ 2022-09-25 21:33  A-Problem-Solver  阅读(13)  评论(0编辑  收藏  举报