洛谷 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;
}
复制代码

 

posted @   LikC1606  阅读(62)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示