博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uva 10891 - Game of Sum(博弈,区间dp)
阅读量:4072 次
发布时间:2019-05-25

本文共 1020 字,大约阅读时间需要 3 分钟。

题目大意:

有长度为n的正数序列,两个游戏者A 和B轮流取,A先取。每次玩家可以选择从序列左边或右边开始取一个或连续多个数字,问最终A最多可以比B大多少?

分析:

设f[l][r]表示对于区间[l,r]的序列,先取的人最多可以取的和。

那么,可以选择把[l,r]的所有数全部取光,或者只取一部分。
如果只取一部分,假设是[l,k]z这区间全部取,那么总共可以得到的和为sum[l,k]+(sum[k+1,r]-f[k+1][r])
所以状态转移为:
f[l][r] = sum[l][r]-min{ min{f[l][k], f[k+1][r]} }, l<=k<r

#include
#include
#include
#include
#include
using namespace std;typedef long long int64;const int INF = 0x3f3f3f3f;int n, arr[110], sum[110];int f[110][110];int main(){ sum[0] = 0; while(~scanf("%d", &n) && n){ for(int i=1; i<=n; ++i){ scanf("%d", &arr[i]); sum[i] = sum[i-1] + arr[i]; } memset(f, 0, sizeof(f)); for(int i=1; i<=n; ++i) f[i][i] = arr[i]; for(int len=2; len<=n; ++len){ for(int l=1; l+len-1<=n; ++l){ int r = l+len-1; int tot = sum[r] - sum[l-1]; f[l][r] = tot; // 把[l, r]全部取 for(int k=l; k

转载地址:http://pvzni.baihongyu.com/

你可能感兴趣的文章
Flash Player10 3D测试
查看>>
浅谈网络游戏项目开发难度
查看>>
flash fps游戏 fps多少为佳
查看>>
心得:对AMF3的误解
查看>>
事件对象的target和currentTarget属性区别
查看>>
事件冒泡阻止event.stopPropagation()
查看>>
Flex4 beta 的 Spark 布局
查看>>
Spark 架构和组件集的简要概述
查看>>
关于flex4中文(zh_CN)本地化应用编译不通过的解决方法
查看>>
摩斯密码表
查看>>
一段摩斯密码里的爱情故事
查看>>
游戏测试的技术难点和测试技术
查看>>
线程简介
查看>>
线程挂起自己,让出CPU
查看>>
线程同步(C# 编程指南)
查看>>
创建高效的线程安全类的步骤
查看>>
Failed to load class "org.slf4j.impl.StaticLoggerB
查看>>
使用 Apache MINA 2 开发网络应用
查看>>
MANIFEST.MF文件的格式
查看>>
NIO入门-了解Buffer
查看>>