A Game_usaco3.3_DP

本文介绍了一种双人游戏中的最优得分策略实现方法。玩家从序列两端取数以获得最大得分,通过动态规划算法计算最优策略下两位玩家的最终得分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description


  有如下一个双人游戏:N(2 <= N <= 100)个正整数的序列放在一个游戏平台上,两人轮流从序列的两端取数,取数后该数字被去掉并累加到本玩家的得分中,当数取尽时,游戏结束。以最终得分多者为胜。
  编一个执行最优策略的程序,最优策略就是使自己能得到在当前情况下最大的可能的总分的策略。你的程序要始终为第二位玩家执行最优策略。

Input


第一行: 正整数N, 表示序列中正整数的个数。
第二行至末尾: 用空格分隔的N个正整数(大小为1-200)。

Output


只有一行,用空格分隔的两个整数: 依次为玩家一和玩家二最终的得分。

Analysis


类似纪中做过的题目,传送门
f[i][j]=max(t[i]+sum[i+1][j]f[i+1][j],t[j]+sum[i][j1]f[i][j1])
其中 sum 是区间和, f[i][j] 表示当前这个人从第 i 个数字取到第j个的最大价值, f[1][n] sum[1][n]f[1][n] 即是答案所求
边界条件 f[i][i]=t[i]

Code


#include <stdio.h>
using namespace std;
int f[201][201],sum[201][201],t[201];
int max(int x,int y)
{
    return x<y?y:x;
}
int main()
{
    int n;
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
    {
        scanf("%d",&t[i]);
        f[i][i]=t[i];
    }
    for (int i=1;i<=n;i++)
        for (int j=i;j<=n;j++)
            sum[i][j]=sum[i][j-1]+t[j];
    for (int j=1;j<=n-1;j++)
        for (int i=1;i<=n-j;i++)
            f[i][i+j]=max(t[i]+sum[i+1][i+j]-f[i+1][i+j],t[i+j]+sum[i][i+j-1]-f[i][i+j-1]);
    printf("%d %d\n",f[1][n],sum[1][n]-f[1][n]);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值