HDU6199 gems gems gems (DP)
2024-09-06 15:11:29
题意:有n颗石子 两个人轮流拿 如果上一个人拿了x颗 这个人就可以拿x或x+1颗
问先手能获得与后手的价值差最大是多少
题解:看起来是博弈 其实是DP
dp[i][j][0/1]表示当前该0/1拿 拿到第i颗上一个人拿了j个 转移就很裸了
因为当前有两种操作拿x个和拿x+1个 要知道哪一个操作更好 需要知道后面的状态 所以就倒着DP
因为爆内存就滚动了 对2^k取% = & 2^k - 1 感觉这样滚动会少个常数
#include <bits/stdc++.h>
using namespace std; int q[];
int sum[];
int dp[][][]; int main()
{
int T;
scanf("%d", &T);
while(T--)
{
sum[] = ;
int n; scanf("%d", &n);
for(int i = ; i <= n; i++) scanf("%d", &q[i]), sum[i] = sum[i - ] + q[i]; memset(dp, , sizeof(dp));
for(int i = n; i >= ; i--)
{
for(int j = ; j <= ; j++)
{
if(i + j == n + )
{
dp[i & ][j][] = sum[n] - sum[i - ];
dp[i & ][j][] = sum[i - ] - sum[n];
break;
} dp[i & ][j][] = max(dp[(i + j) & ][j][], dp[(i + j + ) & ][j + ][] + q[i + j]) + sum[i + j - ] - sum[i - ];
dp[i & ][j][] = min(dp[(i + j) & ][j][], dp[(i + j + ) & ][j + ][] - q[i + j]) - sum[i + j - ] + sum[i - ];
}
}
printf("%d\n", dp[][][]);
}
return ;
}
最新文章
- Laravel大型项目系列教程(二)之用户管理
- 无锁队列以及ABA问题
- PHP将XML数据转换为数组
- js中Math.random()生成指定范围数值的随机数
- HDP2.4安装(二):Centos7配置
- hdu 4447 Yuanfang, What Do You Think?
- 酷派8150S(移动定制版)可用的第三方Recovery备份数据、刷机并精简系统内置APK经验
- TimeUnit(转)
- codeforce --- 237C
- 单元测试不是梦,Android+PowerMock系列(1) —— 在Eclipse里搭建测试环境
- SQL Server2008R2安装失败问题之语言包问题
- hdr_beg(host) 主机名开始
- 一段代码详解JavaScript面向对象
- C++ 构造函数或析构函数调用虚函数
- 实践作业2:黑盒测试实践——安装配置测试工具 Day 3
- zookeeper学习总结
- CSS---文档流布局 | 脱标-postion-zindex | 脱标-浮动
- Java代码操作HDFS
- 实现一个优先级队列,每次pop 返回优先级最高的元素
- 自然语言交流系统 phxnet团队 创新实训 项目博客 (九)