博弈论+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;
}

最新文章

  1. LinQ C#防注入式攻击实例代码
  2. MySQL 安装 + 精简 + 配置
  3. 在ubuntu14.04上部署基于Docker的Gitlab
  4. sql-where
  5. 构造图 Codeforces Round #236 (Div. 2) C. Searching for Graph
  6. java 多个设备,锁定先后顺序
  7. Codevs 1669 运输装备
  8. Hadoop就是一个别人造好的轮子
  9. java中String的.trim()方法
  10. BZOJ_1598_[Usaco2008 Mar]牛跑步_A*
  11. 使用jprofiler分析dump文件一个实例
  12. echo 与 printf的区别与联系
  13. 深度学习Dubbo系列(入门开篇)
  14. 【小玩意】time-passing-by clock
  15. PHP利用get_headers()函数判断远程的url地址是否有效
  16. (转)Awesome Human Pose Estimation
  17. httpclient cookie使用介绍
  18. vmstat工具
  19. 一次简单完整的自动化登录测试-基于python+selenium进行cnblog的自动化登录测试
  20. Linux 通过cron定期执行 php文件(转)

热门文章

  1. activeandroid复制本地数据库问题总结
  2. SQLite - WHERE子句
  3. Thread源码分析-java8
  4. WPF知识点全攻略10- 路由事件
  5. python之道04
  6. 初涉DSU on tree
  7. Gitlab仓库搭建及在Linux/windows中的免密使用
  8. 解决windows管理员已阻止你运行此应用问题
  9. 【练习】reserving.kr 之Direct3D FPS
  10. eclipse代码格式化快捷键无法使用