问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

USACO Section 3.3 A Game pascal代码,最好带解释。

发布网友 发布时间:2024-10-01 15:11

我来回答

1个回答

热心网友 时间:2024-10-17 23:29

您好:这是个双人博弈问题。博弈的最优策略是使对方获利最小的情况下使自己获利最大(“最坏最好”),在搜索中著名的alpha-beta搜索就是针对这种情况:这种博弈假设对手是总是采用最优策略(也就是:遇到“最坏”的对手),而在这种情况下,选择一个行动使得对手的获利最小,即为自身的最优策略。从而,很容易的得到此题的动态规划方程:
设sum(s,t)为区间s,t中的数字之和,gain(s,t)为按最优策略能获得的最大得分,那么,有两种数字的方式,
1.取s,则给对手余下区间(s+1,t),对手的收益将是gain(s+1,t);
2.或者取t,则给对手留下区间(s,t-1),对手的收益将是gain(s,t-1);
无论如何,自身得分是sum(s,t)-对手得分,从而:
gain(s,t)=sum(s,t)-min{gain(s+1,t),gain(s,t-1)}.
程序极为简单。

不过此题引发了我对搜索与DP之间的关系的思考。在搜索注意了重复状态判断与回溯记录结果之后,可进行剪枝,应当比DP更快。只是在算法设计和编程上要复杂很多。之前一直困扰我的这个问题,似乎快有了答案。

/*
ID: blackco3
TASK: game1
LANG: C++
*/
#include <iostream>
#include <memory.h>
using namespace std;
const int _max_len_(100) ;
int n_size, val[_max_len_], sum[_max_len_], gain[_max_len_][_max_len_] ;

int main() {
freopen("game1.in", "r", stdin) ;
freopen("game1.out", "w", stdout) ;
cin >> n_size ;
for( int i=0; i<n_size; i++ )
cin >> val[i] , sum[i] = ( i ? sum[i-1] : 0 ) + val[i] , gain[i][i]=val[i];
for( int s=n_size-1; s>=0; s-- )
for( int t=s+1; t<n_size; t++ )
gain[s][t] = sum[t] - (s?sum[s-1]:0) - min( gain[s][t-1], gain[s+1][t] );
cout << gain[0][n_size-1] << " " << sum[n_size-1]-gain[0][n_size-1] << endl ;
return 0;
}

如楼主急pascal代码,采纳后通知即可

热心网友 时间:2024-10-17 23:36

您好:这是个双人博弈问题。博弈的最优策略是使对方获利最小的情况下使自己获利最大(“最坏最好”),在搜索中著名的alpha-beta搜索就是针对这种情况:这种博弈假设对手是总是采用最优策略(也就是:遇到“最坏”的对手),而在这种情况下,选择一个行动使得对手的获利最小,即为自身的最优策略。从而,很容易的得到此题的动态规划方程:
设sum(s,t)为区间s,t中的数字之和,gain(s,t)为按最优策略能获得的最大得分,那么,有两种数字的方式,
1.取s,则给对手余下区间(s+1,t),对手的收益将是gain(s+1,t);
2.或者取t,则给对手留下区间(s,t-1),对手的收益将是gain(s,t-1);
无论如何,自身得分是sum(s,t)-对手得分,从而:
gain(s,t)=sum(s,t)-min{gain(s+1,t),gain(s,t-1)}.
程序极为简单。

不过此题引发了我对搜索与DP之间的关系的思考。在搜索注意了重复状态判断与回溯记录结果之后,可进行剪枝,应当比DP更快。只是在算法设计和编程上要复杂很多。之前一直困扰我的这个问题,似乎快有了答案。

/*
ID: blackco3
TASK: game1
LANG: C++
*/
#include <iostream>
#include <memory.h>
using namespace std;
const int _max_len_(100) ;
int n_size, val[_max_len_], sum[_max_len_], gain[_max_len_][_max_len_] ;

int main() {
freopen("game1.in", "r", stdin) ;
freopen("game1.out", "w", stdout) ;
cin >> n_size ;
for( int i=0; i<n_size; i++ )
cin >> val[i] , sum[i] = ( i ? sum[i-1] : 0 ) + val[i] , gain[i][i]=val[i];
for( int s=n_size-1; s>=0; s-- )
for( int t=s+1; t<n_size; t++ )
gain[s][t] = sum[t] - (s?sum[s-1]:0) - min( gain[s][t-1], gain[s+1][t] );
cout << gain[0][n_size-1] << " " << sum[n_size-1]-gain[0][n_size-1] << endl ;
return 0;
}

如楼主急pascal代码,采纳后通知即可
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...结构的施工分包给其他单位那么是不是EPC总承包就不能分包 Win11玩不了地平线4如何解决_Win11玩不了地平线4怎么办 Win11玩不了地平线4如何解决_Win11玩不了地平线4怎么解决 地平线5警告显卡内存过低怎么办 极限竞速地平线5闪退怎么解决 极限竞速地平线5闪退解决方法 怎样册除手机屏幕上(精品游戏)图标 烧结普通砖有哪些 烧结普通砖都有哪些 ...4年后的年龄与弟弟3年前的年龄和是35岁。今年哥与弟各几岁??_百度... ...等于弟弟7年后的年龄,哥哥4年后与弟弟3年前的年龄的和是35岁。哥哥... pascal小熊分糖tyvj1608怎么做 360安全路由有哪些安全功能? 手动变速箱进水有什么征兆? 手动变速箱会进水吗? 怎么知道手动变速箱进水了? 节约用电的方法10条? 变频空调为什么声音特别大(创微)刚装的 要到淘宝上买多少东西 才可以开通蚂蚁花呗 手机用慢充有影响吗 怎样计算小数除法? 0.5的爱情是什么意思啊? 阿尔山攻略 阿尔山旅游详细攻略介绍 阿尔山包车价格 阿尔山怎么包车 有什么自驾阿尔山的包车指南分享? 金丝马尾概述 面试中高层当时就有结果吗 深圳市芒果钱包科技有限公司怎么样? 偶合反应偶合过程特点 完全破解a9系统的3ds能不能玩联网游戏 我的新小三A9破解了,可以玩正版日月吗,可以联网吗 ...慢慢在长.最长大概多长时间能长好,这两天感觉耳朵里比前两 耳朵好像有异物,吃饭耳膜有声音... ...就是天天挖耳朵。一直到现在,近3年的时间了。几乎天天挖,一天挖四五... 对乙酰氨基酚栓用法用量 宝宝能用对乙酰氨基酚栓吗 希望大家能告诉我,大寰妤怎么念 大寰妤:许我倾室江山内容简介 之前在微信申请过腾讯王卡 然后一直没去拿 现在过这么久忘了在哪了... 艾尼西亚羊皮卷小说txt全集免费下载 ...即功率1000W左右,要用什么电源芯片?什么变压器?什么电路啊?_百度... NBA2008年全明星新秀阵容和东西部阵容有谁? 记将军回来是李白的作品吗 秋季养生做到6“收” 金岭铁矿人员介绍 山东金岭铁矿简介 金岭铁矿简介 一个固定区域内应安装多少个避雷针?这个在什么规范里进行了规定? 梦幻西游手游定海之弈须弥幻境蛟龙怎么打-定海之弈须弥幻境蛟龙打法技 ... 梦幻西游网页版蛟龙探海攻略大全:蛟龙探海1-5关全关卡通关攻略_百度... 哪位大虾知道C盘里隐藏的PAGEFILE.SYS文件是东东啊