洛谷 P2734 游戏 A Game
题意
给出长为n的序列,有两个人,轮流拿最左边或最右边的,且两个人的拿法的是最优的,写一个程序,判断第一个人和第二个人分别能拿到的的最大值。
做法
这道题的内存足够大,我们可以用动态规划,数组f [ i ] [ j ]表示从i到j这一段序列先手的比后手的多拿多少分。因为只能拿最右边的和最左边的,所以只要递推这两种情况后取最大值即可。
代码
#include<bits/stdc++.h> using namespace std; int n; int a[205]; int f[205][205];//f[i][j]表示从 i 到 j 这段序列先手比后手大的值 int main() { freopen("game1.in","r",stdin); freopen("game1.out","w",stdout); scanf("%d",&n); int s = 0; for(int i=1;i<=n;++i) scanf("%d",&a[i]), f[i][i] = a[i], s+=a[i];//记录 for(int l=2;l<=n;++l) { for(int i=1;i+l-1<=n;++i) { int j = i+l-1; f[i][j] = max(a[i]-f[i+1][j], a[j]-f[i][j-1]);//递推,求最大值 } } printf("%d %d\n", (s+f[1][n])/2, (s-f[1][n])/2);//两个人的值 return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!