……
你家 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;
}
标签:Level,int,scanf,石子,fake,ABC270D,dp
From: https://www.cnblogs.com/AProblemSolver/p/16729039.html