首页 > 其他分享 >P2964 [USACO09NOV] A Coin Game S (博弈论 dp)

P2964 [USACO09NOV] A Coin Game S (博弈论 dp)

时间:2024-07-09 09:32:24浏览次数:15  
标签:std USACO09NOV le int max P2964 Game dp define

P2964 [USACO09NOV] A Coin Game S

博弈论 dp(乱取的)

两个人都希望自己的价值最大,可以认为他俩是等价的。考虑设计 dp 状态,设 \(f_{i,j}\) 表示考虑了前 \(i-1\) 个,现在的先手 \([i,i+j-1]\) 个,他之后能得到的最大价值。转移肯定是从 \(f_{i+j,k}\) 转移过来,并且 \(1\le k\le 2j\)。因为两个人都绝对聪明,所以 \(f_{i+j,k}\) 取 \(\max\)。

\[f_{i,j}=sum_{i,n}-\max\limits_{1\le k \le 2j} f_{i+j,k} \]

容易看出后面是一个前缀 \(\max\) 的形式,预处理 \(g_{i,j}\) 表示 \(f_{i}\) 的前缀 \(\max\) 即可。最后的答案就是 \(\max(f_{1,1},f_{1,2})\)。

复杂度降到 \(O(n^2)\),本题的空间范围小,需要将 \(f\) 数组滚动。

#include <bits/stdc++.h>
#define pii std::pair<int, int>
#define mk std::make_pair
#define fi first
#define se second
#define pb push_back

using i64 = long long;
using ull = unsigned long long;
const i64 iinf = 0x3f3f3f3f, linf = 0x3f3f3f3f3f3f3f3f;
const int N = 2e3 + 10;
int n;
int f[2][N], a[N], s[N], g[N][N];
int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
	std::cin >> n;

	for(int i = 1; i <= n; i++) {
		std::cin >> a[i];
		s[i] = s[i - 1] + a[i];
	}

	for(int i = n; i >= 1; i--) {
		for(int j = 1; i + j - 1 <= n; j++) {
			f[i & 1][j] = (s[n] - s[i - 1]) - g[i + j][j << 1];
		}

		for(int j = 1; j <= n; j++) g[i][j] = std::max(g[i][j - 1], f[i & 1][j]);
	}

	std::cout << std::max(f[1][1], f[1][2]) << "\n";

	return 0;
}

标签:std,USACO09NOV,le,int,max,P2964,Game,dp,define
From: https://www.cnblogs.com/FireRaku/p/18291093

相关文章

  • game1
    进入题目发现是一个游戏发现有一个score.php的发包发现有分数等对比不同分数的包发现sign值都有ZM后疑似为base64于是将分数改为较高的分,ZM+base64尝试要补一个=得到flag......
  • C语言实战项目:贪吃蛇游戏(SnakeGame)
    前言:前面C语言的基础语法和数据结构的顺序表、链表已经学完了,我们就已经有能力去实现一个贪吃蛇项目。我们可以实现一些贪吃蛇的一些功能,例如:食物的随机生成、贪吃蛇的长度、贪吃蛇加速和减速、暂停游戏、贪吃蛇的游戏结束判定等...如下图所示:图片仅限参考真实项目视频:20......
  • 2 Pygame进阶
    1检测用户输入在Pygame中,检测用户的输入有两种方法。一种是遍历整个事件系统,另一种是只获取一个键盘是否按下。接下来让我来叙述一下这两种检测输入的方法:1.1遍历事件系统在上一期中,我们讲到了在创建Pygame窗口时对用户的操作反应。遍历整个事件系统需要使用一个无限循......
  • [LeetCode] 45. Jump Game II
    有点意思,需要动态规划。fromtypingimportListfromcollectionsimportCounterimporttimeclassSolution:defjump(self,nums:List[int])->int:max_reachable=0min_steps=0fori,elementinenumerate(nums):i......
  • [LeetCode] 55. Jump Game
    写了一个符和直觉的递归,时间超限了。fromtypingimportListimporttimeclassSolution:defcanJump(self,nums:List[int])->bool:iflen(nums)==1:returnTruereturnself.isreach(nums,0)defisreach(self,nums:List[i......
  • QOJ2376 Game on a Tree (树形 dp)
    QOJ2376GameonaTree树形dp因为题目限制对于两个人等价,所以朴素的,考虑将\(u\)与祖先和后代连边,构成一个新的无向图。那么题目就变成:在无向图中选一点,每一次操作就是走一步到新的点,谁先不能走,那么另一个人获胜。先说结论:当无向图有完美匹配时,后手胜,反之先手胜。证明:若有......
  • [题解]AT_arc116_d [ARC116D] I Wanna Win The Game
    思路因为题目与二进制有关,考虑往二进制的方向思考。定义\(dp_{i,j}\)表示在所有的\(n\)个数中,当前在决策对于每一个数在二进制表示下的第\(i\)位是\(0\)还是\(1\),且和为\(j\)的方案数。因为异或需要满足对于所有\(a_i\)表示为二进制后每一位\(1\)的个数均为偶数......
  • D. Soldier and Number Game
    题意:给出a和b(1<=b<=a<=5e6),问a!/b!变成1,最多要经过多少轮?没轮可以选择一个它的因子来除它。思路:质因子数量,先线性筛,再质因子分解每个数,再前缀和,然后O1查询。总结:在模板中使用范围质数筛选时,当范围到了5e6就MLE了,没法弄,最后用的线性筛+质因子分解。考虑要不要为模板中单独......
  • 【流星蝴蝶剑game】
    由于《流星蝴蝶剑》是一款较旧的游戏,而且我无法提供受版权保护的游戏的代码,我将提供一个简单的2D游戏编程实例,以展示如何使用Unity引擎和C#语言来创建一个基本的游戏。这个例子将涉及到创建一个玩家角色,使其能够移动并收集物品。首先,确保你已经安装了UnityHub和Unity编辑......
  • 基于Python中的tkinter和pygame库创建一个简单音乐播放器
    importosimporttimeimporttkinterastkfromtkinterimportfiledialog,messagebox,ttkimportpygameimportmutagen.mp3#用于获取MP3文件时长classMusicPlayer:def__init__(self,root):pygame.init()self.root=rootsel......