HDU 6199 gems gems gems DP动态规划 滚动数组

本文解析HDU6199与Codeforces737 D两道博弈题,采用动态规划解决游戏策略问题,A与B玩家轮流出招,目标最大化或最小化得分差。通过滚动数组优化空间复杂度。

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

HDU 6199

还有一道题和这道差不多:codeforces 737  D 题解链接:https://blog.youkuaiyun.com/flyzer/article/details/90204019

题意:A和B两个人玩游戏,有一个数组a,两个人轮流取数,A先,两个人都是只能从左往右取,并且如果前一个人取了k个数,那么接下来的那个人就得取k或者k+1个数,如果剩下的数不足k个,那么游戏结束,输出  “A取出的值的和”  减去 “B取出的数的和” 的差。A想让这个差尽可能的大,B想让这个差尽可能的小,两个人都采取最优解,问最后的差是多少。

在一篇博客上看到一句话:

这种两人博弈一般都可以用两个dp写, 一个dp描述第一个人的最优态, 第二个dp描述第二个人的最优态,难点在于优化空间。

hdu 6199 和 cf 737 D 题目的区别在于,hdu这道题两个人都是从左往右取,而cf这道题是第一个人从左往右取,第二个人从右往左取,还有就是数据范围的差别,其他的完全一样。

cf那道题只要记忆化搜索就行了,但是hdu这道题不行,因为会MLE,所以只能动态规划,由于只跟后200个左右的状态有关,我们考虑用滚动数组的方式来储存dp。

hdu这道题推荐这篇博客:https://blog.youkuaiyun.com/V5ZSQ/article/details/79325575

AC code:

(因为是多组输入,不要忘了对dp数组进行初始化,否则会WA)

//#pragma comment(linker, "/STACK:102400000,102400000")
#include<bits/stdc++.h>
#define mem(a,b) memset((a),b,sizeof(a))
typedef long long ll;
#define Mod 233    //只要大于等于200就行
using namespace std;
int n,a[20001];
int dp[2001][255][2];
int sum[20001];
int main()
{
    int T;  scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        sum[0]=0;
        for(int i=1;i<=n;i++)
            {scanf("%d",&a[i]);sum[i]=sum[i-1]+a[i];}
        int ans=0;
        mem(dp,0);
        //从第i个石子开始取且上一轮对手取了j个
        for(int i=n;i>=1;i--)
            for(int j=200;j>=1;j--)
            {
                if(n-i+1<j)
                    continue;
                dp[i%Mod][j][0]=dp[(i+j)%Mod][j][1]+(sum[i+j-1]-sum[i-1]);
                dp[i%Mod][j][1]=dp[(i+j)%Mod][j][0]-(sum[i+j-1]-sum[i-1]);
                if(n-i+1>j)
                {
                    dp[i%Mod][j][0]=max(dp[i%Mod][j][0],dp[(i+j+1)%Mod][j+1][1]+(sum[i+j]-sum[i-1]));
                    dp[i%Mod][j][1]=min(dp[i%Mod][j][1],dp[(i+j+1)%Mod][j+1][0]-(sum[i+j]-sum[i-1]));
                }
            }
        printf("%d\n",dp[1][1][0]);
    }
    return 0;
}

 

1、支持屏幕打印,控制方法多样,可以打印全部rxlib控件全部InfoPower控件,TDBGrid,TStringGrid,TImage,TEdit等,TDBGridEh,f1book,TDecisionGrid等等众多控件。(例子1,例子2,例子3,例子4,例子5)   2、支持最终用户设计、修改报表,只需连接相关的数据源,指出数据的位置(设置报表样式),无论是主从表,子报表,套表,都可迅速生成。开发一个报表只需几分钟的时间。   3、报表样式可以保存为rmf格式,下次可通过读入使用(配合SQL脚本就可以生成报表)。并可以把带数据的报表保存为rmp格式,在任何机器上都可以浏览、打印,而不需要数据库。   4、生成后的报表支持修改,包括字体的设置,边框的设置,修改内容等。   5、报表编辑器内自带ado,bde,ibx,Diamond dao,dbisam等数据访问控件,可以通过这些控件开发独立的报表制作工具。其使用方法和delphi中的控件是一样的。   6、完全、自由自定义页面、边距、字体,标题和页眉页脚,并可以在自认合适的地方插入函数来实现当前日期,页合计,总合计等功能,合计字段可以放在页头,分组头,并支持条件合计,对分组合计,分页合计,总计等只需简单地设置属性即可。   7、完全支持D5--D7,BCB5--BCB6。   8、报表中可以在自认合适的事件(on beforeprint,on afterprint等)中加入程序脚本,以控制、或实现更复杂的打印效果。   9、更新迅速,可根据使用人员用户的意见,不断的加入新的功能。   10、多种格式转换,可以把做出的报表转换为html,xls,pdf,bmp,jpeg等等格式。   11、自动对超长记录折行,超长的内容也会自动折行,中文换行不会乱码。   12、首家支持缩放打印功能,可以根据打印时选择的纸张自动缩放报表。   13、首家支持即打即停.   14、首家提供类似excel的报表设计器,给你足够灵活方表的报表设计方式。   15、首家提供双报表设计器(第一种,第二种),满足所有的需求。   16、更是提供类似于ObjectPascal的script,实现特殊功能。   17、首家提供web,IntraWeb中的报表解决方案。   18、首家提供报表压缩处理,占用内存更少,生成报表速度更快。   19、首家提供合并单元格功能,更加适应处理复杂的中文报表。   20、自动填空行,每页打印数量等细节处理更完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值