NOIP模拟 Game - 简单博弈,dp

题意:

有n个带权球,A和B两个人,A先手拿球,一开始可以拿1个或2个,如果前一个人拿了k个,那么当前的这个人只能那k或k+1个,如果当前剩余的球不足,那么剩下的球都作废,游戏结束。假设两个人都是聪明人,每个人都会想方设法设获得比对方更多的球。问A最多能B多拿多少。

分析:

可以将先手取1~n的最优值看做一个问题,先手取2~n又是一个新的子问题,这样递归下去,便可求解。
\(f[i][k]\)表示从第i个开始,可以取k或k+1个,先手取比对方多出的最大值(可能是负数)。
考虑用记忆化搜索:
\(f[i][k] = max(sum[i, i + k - 1] + f[i + k][k], sum[i, i + k] + f[i + k + 1][k + 1])\)
注意递归边界及条件。

记忆化搜索的常数极大,考试时明明写的正解都被卡飞了,改了一个小小的初始化就A了,还是多写递推吧。

code

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<ctime>
#include<vector>
#include<queue>
#include<map>
using namespace std;
namespace IO{
    template<typename T>
    inline void read(T &x){
        T i = 0, f = 1; char ch = getchar();
        for(; (ch < '0' || ch > '9') && ch != '-'; ch = getchar());
        if(ch == '-') f = -1, ch = getchar();
        for(; ch >= '0' && ch <= '9'; ch = getchar()) i = (i << 3) + (i << 1) + (ch - '0');
        x = i * f;
    }
    template<typename T>
    inline void wr(T x){
        if(x < 0) putchar('-'), x = -x;
        if(x > 9) wr(x / 10);
        putchar(x % 10 + '0');
    }
}using namespace IO;

const int N = 2e4 + 50, OO = 2e9 + 5;
int T, n;
int a[N], sum[N];
typedef pair<int,int> P;
int f[N][250];
int vst[N][250], vt;

inline void  chkmx(int &x, const int &y){
    if(x < y) x = y;
}

inline int F(int x, int k){
//  if(f[x][k] != -OO) return f[x][k];
    if(vst[x][k] == vt) return f[x][k];
    vst[x][k] = vt;
    if(x > n - k + 1)
        return f[x][k] = 0;
    int ret = -OO;
    if(x <= n - (k + 1) + 1)
        chkmx(ret, sum[x + k] - sum[x - 1] - F(x + k + 1, k + 1));
    chkmx(ret, sum[x + k - 1] - sum[x - 1] - F(x + k, k));
    return f[x][k] = ret;
}

int main(){
    freopen("game.in", "r", stdin);
    freopen("game.out", "w", stdout);
    read(T);
    while(T--){
        read(n);
        sum[0] = 0;
        for(register int i = 1; i <= n; i++) read(a[i]), sum[i] = sum[i - 1] + a[i];
//        for(register int i = 1; i <= n; i++)
//            for(register int j = 0; j <= 200; j++)
//                f[i][j] = -OO;
        vt++;
        wr(F(1, 1));
        putchar('\n');
    }
    return 0;
}

转载于:https://www.cnblogs.com/CzYoL/p/7756383.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值