洛谷 [P2964] 硬币的游戏
2024-08-30 13:15:18
博弈论+dp
依旧是博弈论的壳子,但问的是最大值,所以要dp
设 dp[i][j] 表示该取 i 号硬币,上一次取了 j 个的先手能取的最大值,
因为每次从小到大枚举复杂度太高,所以我们要从 dp[i][i - 1] 转移,每次新加两个状态即可
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAXN = 2030;
int init() {
int rv = 0, fh = 1;
char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') fh = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
rv = (rv<<1) + (rv<<3) + c - '0';
c = getchar();
}
return fh * rv;
}
int n, num[MAXN], pre[MAXN], dp[MAXN][MAXN];
int main() {
freopen("in.txt", "r", stdin);
n = init();
for(int i = n ; i >= 1 ; i--) {
num[i] = init();
}
for(int i = 1 ; i <= n ; i++) {
pre[i] = pre[i - 1] + num[i];
}
for(int i = 1 ; i <= n ; i++) {
for(int j = 1 ; j <= n ; j++) {
dp[i][j] = dp[i][j - 1];
int k = j * 2 - 1;
if(i >= k) dp[i][j] = max(dp[i][j], pre[i] - dp[i - k][k]);
k++;
if(i >= k) dp[i][j] = max(dp[i][j], pre[i] - dp[i - k][k]);
}
}
cout<<dp[n][1]<<endl;
fclose(stdin);
return 0;
}
最新文章
- LinQ C#防注入式攻击实例代码
- MySQL 安装 + 精简 + 配置
- 在ubuntu14.04上部署基于Docker的Gitlab
- sql-where
- 构造图 Codeforces Round #236 (Div. 2) C. Searching for Graph
- java 多个设备,锁定先后顺序
- Codevs 1669 运输装备
- Hadoop就是一个别人造好的轮子
- java中String的.trim()方法
- BZOJ_1598_[Usaco2008 Mar]牛跑步_A*
- 使用jprofiler分析dump文件一个实例
- echo 与 printf的区别与联系
- 深度学习Dubbo系列(入门开篇)
- 【小玩意】time-passing-by clock
- PHP利用get_headers()函数判断远程的url地址是否有效
- (转)Awesome Human Pose Estimation
- httpclient cookie使用介绍
- vmstat工具
- 一次简单完整的自动化登录测试-基于python+selenium进行cnblog的自动化登录测试
- Linux 通过cron定期执行 php文件(转)