题意:
两个人分别从长度为n的数列的两端开始取数,如果前一 个人取了k个数,后一个人必须取k或k+1个。
第一个人最 开始可以取1个或2个,不能操作时结束。
两个人都希望自 己取到的数字之和尽量大,并保持绝对理智,求最后他们 取到的数字之和之差。
n≤4000。
 
以下是bb----------------------------------------------------
 
这道题我看了老师的讲稿,,跟着老师的讲稿里的DP做,,然后,,妥妥MLE。(也有可能是gyf我太菜了。
当然,神仙老师的思路是对的
老师的做法是这么写的:设f[i][j][k][0/1]表示左侧第一个未取的数是第i个,右侧第一个未取的数是第j个,当前k的值和操作方法。
但很明显会MLE啊由题意有f[4001][4001][16][2],woc内存占用1.6G。
下面是我惨痛的教训(当时我还不知道我内存爆了!!因为我忘记乘int的4了,所以一直以为我的内存在400M-,还问了旁边电脑科技巨佬jxy,外加一个洛谷讨论):

 后来我果断打开题解(雾
 
发现可以hash。正好那边洛谷讨论指出我没有乘int的四个字节。。绝望。
 
以上是bb----------------------------------------
 
 
说正解吧
 
设f[i][j][k][0/1]表示左侧第一个未取的数是第i个,右侧第一个未取的数是第j个,当前k的值和操作方法。
丛表面看像O(nmk)。
仔细观察,发现k是log2n 级别的!
仔细观察,发现i与n-j相差不会超过k级别!
(其实都是课件里的东西)
 
所以我们成功的不用任何操作的将O(nmk)转移到了O(n2)级别(大雾)
 
这就是所谓的方程的冗余,只要你常数小,说不定考场上你以为暴力的算法就AC了。。
 
 
那么好了,将f[i][j][k][0/1]hash存储。
直接记忆化了动态方程太恶心不想写(虽然这是要用常数换的
 
完结撒花。
 
Code:
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define getsum(l,r) (sum[r] - sum[l-1])
  4.  
  5. int n;
  6. ],sum[];
  7.  
  8. int Hash(int a,int b,int c,int d){
  9. +c)*+d) %();
  10. }
  11.  
  12. int dfs(int x,int y,int k,int now){
  13. < k);
  14. == k):);
  15. int num = Hash(x,y,k,now);
  16. if(~dp[num])return dp[num];
  17. ;
  18. if(now){
  19. ans = dfs(x,y-k,k,) - getsum(y-k+,y);
  20. ,k+,)-getsum(y-k,y));
  21. return dp[num] = ans;
  22. }
  23. else{
  24. ans = dfs(x + k,y,k,)+getsum(x,x+k-);
  25. ,y,k+,)+getsum(x,x+k));
  26. return dp[num] = ans;
  27. }
  28. }
  29.  
  30. int main(){
  31. ios::sync_with_stdio();
  32. cin>>n;
  33. memset(dp,-,sizeof(dp));
  34. ;i<=n;++i)cin>>sum[i],sum[i] += sum[i-];
  35. cout<<dfs(,n,,);
  36. ;
  37. }
 
 

[Codeforces 729F] Financiers Game的更多相关文章

  1. Codeforces Round #380 Div.2 F - Financiers Game

    F - Financiers Game 这种两人博弈一般都可以用两个dp写, 一个dp描述第一个人的最优态, 第二个dp描述第二个人的最优态,难点在于优化空间... 我感觉这个空间开得有点玄学.. d ...

  2. Financiers Game CodeForces - 737D (博弈论)

    直接暴力区间DP的话是$O(n^3)$, 关键注意到每步走的距离差不超过1, 所以差最大是$O(\sqrt{n})$的, 所以实际上有用的状态是$O(n^2)$的, 可以通过.

  3. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  4. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  5. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

  6. 【Codeforces 738A】Interview with Oleg

    http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...

  7. CodeForces - 662A Gambling Nim

    http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...

  8. CodeForces - 274B Zero Tree

    http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...

  9. CodeForces - 261B Maxim and Restaurant

    http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...

随机推荐

  1. Nacos-作为Sring cloud 注册发现

    Nacos:一个更易于构建云原生应用的动态服务发现.配置管理和服务管理平台. https://nacos.io/zh-cn/index.html 功能: 动态服务配置 服务发现和管理 动态DNS服务 ...

  2. Redis数据库-基础篇

    Redis Redis是一个开源的,先进的key-value存储. 它通常被称为数据结构服务器,因为键可以包含字符串,哈希,链表,集合和有序集合. Redis 简介 Redis 是完全开源免费的,遵守 ...

  3. JS的video获取时长,出现问题汇总

    <video id="my_video_1" controls="controls" style=" width: 700px; height: ...

  4. Linux笔记1-简介

    以下为观看兄弟连视频教程所记. 1.简介 1965年,MIT.GE.AT&T的贝尔实验室 --> Multics 分时.庞大 1969年,贝尔实验室的肯·汤普森 --> Unix ...

  5. Mata标签,og标签

    一.Mata标签 meta是用来在HTML文档中模拟HTTP协议的响应头报文,meta 标签用于网页的<head>与</head>中.meta 的属性有两种:name和http ...

  6. linux性能分析工具Uptime

  7. 2.VUE前端框架学习记录二

    VUE前端框架学习记录二:Vue核心基础2(完结)文字信息没办法描述清楚,主要看编码实战里面,有附带有一个完整可用的Html页面,有需要的同学到脑图里面自取.脑图地址http://naotu.baid ...

  8. Sass-@if的使用

    @if 指令是一个 SassScript,它可以根据条件来处理样式块,如果条件为 true 返回一个样式块,反之 false 返回另一个样式块.在 Sass 中除了 @if 之,还可以配合 @else ...

  9. robotframework

    常用关键字* Settings * Library Selenium2Library1* Keywords * 打开浏览器 [Arguments] ${url} ${browser} [Documen ...

  10. robotframework的if else