其他分享
首页 > 其他分享> > 洛谷 P2964 [USACO09NOV]A Coin Game S 解题报告

洛谷 P2964 [USACO09NOV]A Coin Game S 解题报告

作者:互联网

## 洛谷 P2964 [USACO09NOV]A Coin Game S 解题报告

[link](https://www.luogu.com.cn/problem/P2964)

### 题意

由 n个硬币,每一个硬币都有一个面值,两个人轮流取硬币,第一个人可以取$1$~$2$ 个硬币,设第一个人取了 $j$ 个硬币,则第二个人可以取 $1$ ~ $2\times j$ 个硬币,并以此类推,每一次当前的人都可以取 $1$~$2\times j$ 个硬币( $j$为上一个人取的硬币数),最后输出第一个人最多能拿多少面值。

### Solutions

__正难则反__

正着求解会很难设状态,所以我们将顺序倒过来,从输入时就倒着输入,求解时也倒着求解。

设$dp_{i,j}$表示__当轮到该玩家拿硬币时,还剩余编号为$1$ ~ $i$的硬币(倒序,1为最底下的硬币编号),上一位玩家拿走了$j$枚硬币。__

即当前玩家可拿$1$ ~ $2 \times j$枚硬币。

记$sum_i$为$c$数组的前缀和数组。

__正难则反__,则该玩家所能获得的最大收益就是$sum_i$减去其__补集__——状态$dp_{i,k}$玩家的最大价值。

显而易见,这样的$dp$时间复杂度时杂度为$O(n^3)$,无法通过此题。

手玩一下不难发现,$dp_{i,j}$与$dp_{i,j-1}$的状态只相差两种可能,因此可以通过$dp_{i,j-1}$用$O(1)$的常数时间推导出$dp_{i,j}$。

最终时间复杂度$O(n^2)$,可以通过此题。

### Proves

$dp_{i,j-1}是枚举k从1到2 \times (j-1),即在1到2 \times (j-1)个sum_i - dp_{i-k,k}取max作为补集。$

$同理,dp_{i,j}是枚举j从1到2 \times j,即在1到2 \times j个sum_i - dp_{i-k,k}取max。$

证毕。

因此$dp_(i,j)$__严格包含__$dp_{i,j-1}$,即在$dp_{i,j-1}$的基础上我们只需继续枚举比较$k=2\times(j-1)$与$k=2\times j$就行。

### Code

```cpp
#include <bits/stdc++.h>
using namespace std;
inline int read() {
int x = 0; char ch = getchar(); bool sgn = 0;
while (ch < '0' || ch > '9') sgn |= ch == '-', ch = getchar();
while (ch >= '0' && ch <= '9') x = x * 10 + (ch & 15), ch = getchar();
return sgn ? -x : x;
}
const int MN = 2e3 + 10;
int n, c[MN], sum[MN], dp[MN][MN];
signed main() {
n = read();
for (int i = n; i >= 1; --i) c[i] = read();
for (int i = 1; i <= n; ++i) sum[i] = sum[i - 1] + c[i];
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
dp[i][j] = dp[i][j - 1];
if (2 * j - 1 <= i) dp[i][j] = max(dp[i][j], sum[i] - dp[i - (2 * j - 1)][2 * j - 1]);
if (2 * j <= i) dp[i][j] = max(dp[i][j], sum[i] - dp[i - (2 * j)][2 * j]);
}
}
cout << dp[n][1] << '\n';
return 0;
}
```

 

 

TRANSLATE with x English
Arabic Hebrew Polish
Bulgarian Hindi Portuguese
Catalan Hmong Daw Romanian
Chinese Simplified Hungarian Russian
Chinese Traditional Indonesian Slovak
Czech Italian Slovenian
Danish Japanese Spanish
Dutch Klingon Swedish
English Korean Thai
Estonian Latvian Turkish
Finnish Lithuanian Ukrainian
French Malay Urdu
German Maltese Vietnamese
Greek Norwegian Welsh
Haitian Creole Persian  
  TRANSLATE with COPY THE URL BELOW Back EMBED THE SNIPPET BELOW IN YOUR SITE Enable collaborative features and customize widget: Bing Webmaster Portal Back

标签:__,USACO09NOV,ch,洛谷,硬币,int,times,P2964,dp
来源: https://www.cnblogs.com/zjsqwq/p/16356660.html