首页 > 其他分享 >[AtCoder - tdpc_game] :ゲーム 题解

[AtCoder - tdpc_game] :ゲーム 题解

时间:2024-08-20 15:26:53浏览次数:6  
标签:AtCoder min int 题解 ret game num dfs dp

[AtCoder - tdpc_game] :ゲーム 题解

一道小清新 \(dp\) 题。

定义 \(dp_{i,j}\) 为第一堆山还有 \(i\) 个物品,第二堆山还有 \(j\) 个物品,すぬけ君能取得物品的最大价值。

由于只能取两座山最上面的物品,假设当前两座山分别有 \({x,y}\) 个物品,すぬけ君选后只能有两种情况,分别为 \(dp_{i-1,j}\) 或 \(dp_{i,j-1}\)。可增加的价值分别为 \(a_i\) 和 \(b_j\)。

他想让自己的答案尽量大,应取 \(max\)。

现在该另一人选择,他取了物品后将会有 \(3\) 种情况,分别为 \(dp_{i-2,j}\),\(dp_{i-1,j-1}\),\(dp_{i,j-2}\)。

这 \(3\) 种情况怎么来的?现在有 \(dp_{i-1,j}\) 或 \(dp_{i,j-1}\) 两种情况,另一人在两座山中再选物品。

那么,由 \(dp_{i-1,j}\) 可推出 \(dp_{i-1-1,j} = dp_{i-2,j}\) 和 \(dp_{i-1,j-1}\)。

同理,由 \(dp_{i,j-1}\) 可推出 \(dp_{i-1,j-1}\) 和 \(dp_{i,j-1-1}=dp_{i,j-2}\)。

整理可得以上 \(3\) 种情况了。

但是,由于两人都同样聪明,他会让すぬけ君接下来的答案尽量小。

所以应该以上两种情况分别取 \(min\)。

整的转移式为 \(dp_{i,j} = max(a_i + min(dp_{i-1,j-1}, dp_{i-2,j}), b_j + min(dp_{i-1,j-1},dp_{i,j-2})\)。

好了,此题就结束了。

最后贴上代码:

#include <bits/stdc++.h>
#define ll long long
#define pii pair <int, int>
using namespace std;
const int mod = 1e9 + 7;
const int N = 1e3 + 10;
int n, m, a[N], b[N], dp[N][N];
inline ll dfs(int x, int y) {
	if (!x && !y) return dp[x][y] = 0; 
	if (dp[x][y] != -1) return dp[x][y];
	ll ret = 0, num = 1e18;
	if (x >= 1 && y >= 1) num = min(num, dfs(x - 1, y - 1));
	if (x >= 2) num = min(num, dfs(x - 2, y));
	if (num == 1e18) num = 0;
	ret = max(ret, a[x] + num);
	
	num = 1e18;
	if (x >= 1 && y >= 1) num = min(num, dfs(x - 1, y - 1));
	if (y >= 2) num = min(num, dfs(x, y - 2));
	if (num == 1e18) num = 0;
	ret = max(ret, b[y] + num); 
	return dp[x][y] = ret;
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	cin >> n >> m;
	for (int i = 1; i <= n; ++i)
		cin >> a[i];
	for (int i = 1; i <= m; ++i)
		cin >> b[i];
	reverse(a + 1, a + n + 1);
	reverse(b + 1, b + m + 1);
    //注意翻转两个数组
	memset(dp, -1, sizeof dp);
	ll ans = dfs(n, m);
	cout << ans << "\n";
//	for (int i = 1; i <= n; ++i) {
//		for (int j = 1; j <= m; ++j)
//			cout << dp[i][j] << " ";
//		cout << "\n";
//	}
	return 0;
}

标签:AtCoder,min,int,题解,ret,game,num,dfs,dp
From: https://www.cnblogs.com/2026zhaoyl/p/18369513

相关文章

  • AtCoder ABC 367
    前言本题解部分思路来自于网络,仅供参考。A-ShoutEveryday题目大意给定Takahashi每天的睡觉时间和起床时间,求Takahashi在$A$时是睡着的还是清醒的。解题思路根据题意模拟即可。code#include<bits/stdc++.h>usingnamespacestd;intmain(){inta,b,c;......
  • 题解:P10279 [USACO24OPEN] The 'Winning' Gene S
    思路建议升蓝。算法一考虑暴力。我们先枚举\(K,L\),考虑如何求解。直接枚举每一个\(K\)-mer,再枚举里面的每一个长度为\(L\)的子串,找到最大的子串并在起始部分打一个标记。最后直接看有几个地方被打标记就行。时间复杂度:\(O(n^4)\)。预计能过测试点\(1-4\)。算法二我们......
  • [题解]P4052 [JSOI2007] 文本生成器
    P4052[JSOI2007]文本生成器正难则反,我们发现用总字符串个数\(26^m\),减去不可读的字符串个数,就是答案。要使一个字符串不可读,就不能让任何模式串在其中出现。如果某个主串的第\(i\)位与自动机的节点\(j\)相匹配,那么如果状态\(j\)包含模式串(即有一个前缀是一个模式串),那么不管主......
  • 关系代数、函数依赖、Armstrong公理及软考试题解析
    注:本文面向于软考高级—系统架构设计师,具体来说是数据库部分,知识点偏零碎化。想要系统学习数据库原理的,可考虑去看《数据库原理》,清华大学出版社或其他出版社皆可。概述概念关系,就是二维表。特性:列不可分性:关系中每一列都是不可再分的属性,即不能出现如下复合属性行列无序性:......
  • P1543 [POI2004] SZP 题解
    P1543[POI2004]SZP题解传送门。题目简述有\(n\)个人,每个人都会监视另一个人,要求选出尽可能多的同学,使得选出的每一名同学都必定会被监视到。且选出的同学不可再监视其他人。思路简述因为任意一个人只能被另一个人管,那么就想到,如果没人管的同学就不能被选(不被监视)。若某......
  • 题解:[TJOI2018] 游园会
    所谓dp套dp,实际上就是在说求解一个dp的过程中,我们用另一个dp求解出他应该从某个状态转移到另一个状态。考虑一下这道题,首先求LCS的dp如下:\[dp_{i,j}=\max\{dp_{i-1,j},dp_{i,j-1},dp_{i-1,j-1}+[s_i==t_j]\}\]显然,当\(i\)固定的时候,\(dp_{i,j}\)是单调不降的,且相邻两......
  • 【LGR-196-Div.4】洛谷入门赛 #26 题A - H 详细题解--优化思路简洁代码(C++,Python语
    前言:    觉得这个比赛很有意思的,都是暴力题,涉及一些细节,难度比较适合刚学编程语言的,可以很好的锻炼基础还有手速,最后两题也是比较有意思,之后也准备更新atc的比赛题解和洛谷的一些高质量比赛题解(算法网瘾就是想参加各种比赛)   如果觉得有帮助,或者觉得我写的好,......
  • [NOI]2024 登山 题解
    好像在洛谷题解区里还没人和我做法一样,,?考场做法,只用到了倍增和线段树,感觉挺好写。考场上从开题到过题只用了2h。最底下有省流版(?)。以下是我考场里比较详细的思路,所以比较长。先考虑如何\(O(n^2)\)做,然后再想优化。容易先想到一个状态数是\(O(n^2)\)的DP,即记录起点,并将向......
  • AGC002 题解
    目录A-RangeProductB-BoxandBallC-KnotPuzzleA-RangeProduct分情况讨论:\(a\le0\leb\)时,乘积一定为\(0\);否则:\(0<a\leb\)时,乘积一定为正;否则,负数的个数有\(b-a+1\)个,判断这个数是否为奇数,若是,乘积为负,否则为正。#include<bits/stdc++.h......
  • P10423题解
    P10423[蓝桥杯2024省B]填空问题先贴上答案#include<iostream>usingnamespacestd;intmain(){stringans[]={"1204","1100325199.77",};charT;cin>>T;cout<<ans[T-'A']......