转移都很明显的一道DP题。按照不优化的思路,定义状态$dp[i][j][0/1]$表示吃到第$i$天,当前胃容量为$j$,前一天吃(1)或不吃(0)时能够得到的最大价值。

因为有一个两天不吃可以复原容量的定义,所以需要前一天的状态。

而注意,容量表示的是当前第$i$天吃之前的容量。

然后考虑压缩空间,将天数滚动。要注意的是滚动过后$now$指向的是$i$后一天的状态,因此刷表更新。

#include<bits/stdc++.h>
using namespace std; int n, m;
int a[], dp[][][], ap[]; int main() {
freopen("buffet.in", "r", stdin);
freopen("buffet.out", "w", stdout);
scanf("%d%d", &n, &m);
int ans = ;
for(int i = ; i <= n; i ++) scanf("%d", &a[i]);
ap[] = m;
for(int i = ; i <= n; i ++) ap[i] = ap[i-] * / ;
int now = ;
memset(dp[now], -, sizeof(dp[now]));
dp[][][] = ;
for(int i = ; i <= n; i ++) {
now ^= ;
memset(dp[now], -, sizeof(dp[now]));
for(int j = ; j <= n; j ++) {
if(~dp[now^][j][]) {
dp[now][][] = max(dp[now][][], dp[now^][j][]);
dp[now][j+][] = max(dp[now][j+][], dp[now^][j][] + min(a[i], ap[j]));
}
if(~dp[now^][j][]) {
dp[now][j+][] = max(dp[now][j+][], dp[now^][j][] + min(a[i], ap[j]));
dp[now][j-][] = max(dp[now][j-][], dp[now^][j][]);
}
}
}
for(int i = ; i <= n; i ++)
ans = max(ans, max(dp[now][i][], dp[now][i][]));
printf("%d", ans);
return ;
}

概率神题,三校只有$yuli$dalao$A$掉了%%%%

非常神奇的记忆化搜索,就算我能把式子推出来也会弄晕的QAQ

定义$dp[i][j]$表示当前剩余$i$个人,当前编号为$j$的人的存活概率。枪在当前1号手中。

注意这个当前,表示的是此时剩下来的人重新从0编号。

可以推出转移式子:$dp[i][j]=q*dp[i-1][j-1]+(1-q)*dp[i][(j-kmodi+i)modi]$,$q$表示当前这枪打出去能打出来的概率。$q=(i-1)/C$,因为当前子弹比人数要少1。前一个式子是打出了这个枪,于是0死了,j在剩下的人中号数要-1,(1把枪移交2相当与2变为了现在的1),后面的式子是打了空枪,枪移交给后面第k个人,同样也是把整个队列往前移k位。

观察式子可以发现,$dp[i-1][j-1]$我们可以在记忆化搜索中递归求得,而后面$dp[i][(j-kmodi+i)modi]$是与$dp[i][j]$同层的,考虑怎么求得。

可以发现,如果一直打空枪,从$j$开始,一定可以通过环走回$j$。所以在递归边界式子变为$dp[i][j]=o+(1-q)^ndp[i][j]$,其中每个$(1-q)$虽然不同,但在搜索过程中可以顺便算出来。$o$表示的是在以后的层数中可以求得的,因为我们可以把$dp[i][(j-kmodi+i)modi]$带入最开始的转移式,再把它们按层数分离。然后就按分离出来的式子将每一步更新即可。

过程中记忆化即可。然后概率要用逆元,可以预处理出来。

#include<bits/stdc++.h>
#define LL long long
#define mod 1000000009
using namespace std; int T, N, C, K; int vf[];
int dp[][], vis[][];
LL mpow(int a, LL b) {
LL ans = ;
for(; b; b >>= , a = 1ll * a * a % mod)
if(b & ) ans = 1ll * ans * a % mod;
return ans;
} int dfs(int res, int pos, int oo, int gl) {
if(pos == -) return ;
if(res == ) return ;
if(vis[res][pos] && dp[res][pos] == -) {//同层中走回来了 可以直接算
dp[res][pos] = 1ll * oo * mpow(( - gl + mod) % mod, mod - ) % mod;
return dp[res][pos];
}
if(vis[res][pos]) return dp[res][pos];//记忆化
vis[res][pos] = ;
dfs(res, (pos - K % res + res) % res, (oo + 1ll * gl * (res - ) % mod * vf[C] % mod * dfs(res - , pos - , , ) % mod) % mod, 1ll * gl * (C - res + ) % mod * vf[C] % mod);//子弹共有res-1个
if(~dp[res][pos]) return dp[res][pos];
dp[res][pos] = (1ll * (res - ) * vf[C] % mod * dfs(res - , pos - , , ) % mod + 1ll * (C - res + ) * vf[C] % mod * dp[res][(pos - K % res + res) % res] % mod) % mod;
return dp[res][pos];
} int main() {
freopen("gun.in", "r", stdin);
freopen("gun.out", "w", stdout);
scanf("%d", &T);
for(int i = ; i <= ; i ++) vf[i] = mpow(i, mod - );
while(T --) {
memset(vis, , sizeof(vis));
memset(dp, -, sizeof(dp));
scanf("%d%d%d", &N, &C, &K);
for(int i = ; i < N; i ++)
printf("%d ", dfs(N, i, , ));
printf("\n");
}
}

【10.5校内测试】【DP】【概率】的更多相关文章

  1. 【10.17校内测试】【二进制数位DP】【博弈论/预处理】【玄学(?)DP】

    Solution 几乎是秒想到的水题叻! 异或很容易想到每一位单独做贡献,所以我们需要统计的是区间内每一位上做的贡献,就是统计区间内每一位是1的数的数量. 所以就写数位dp辣!(昨天才做了数字统计不要 ...

  2. 【10.31校内测试】【组合数学】【记忆化搜索/DP】【多起点多终点二进制拆位Spfa】

    Solution 注意取模!!! Code #include<bits/stdc++.h> #define mod 1000000007 #define LL long long usin ...

  3. 【10.29校内测试】【线段树】【DP】【二进制Trie树求最小值最大】

    Solution 标程太暴力惹QAQ 相当于是26棵线段树的说QAQ 不过我写了另一种写法,从大到小枚举每一个字母,标记字典序在这个字母之上的位置为1,每次都建一棵线段树,维护1的数量,即区间和. 修 ...

  4. 【10.26校内测试】【状压?DP】【最小生成树?搜索?】

    Solution 据说正解DP30行??? 然后写了100行的状压DP?? 疯狂特判,一算极限时间复杂度过不了aaa!! 然而还是过了....QAQ 所以我定的状态是待转移的位置的前三位,用6位二进制 ...

  5. 【10.4校内测试】【轮廓线DP】【中国剩余定理】【Trie树+博弈】

    考场上几乎是一看就看出来轮廓线叻...可是调了两个小时打死也过不了手出样例!std发下来一对,特判对的啊,转移对的啊,$dp$数组竟然没有取max!!! 某位考生当场死亡. 结果下午又请了诸位dala ...

  6. 【10.3校内测试【国庆七天乐!】】【DP+组合数学/容斥】【spfa多起点多终点+二进制分类】

    最开始想的暴力DP是把天数作为一个维度所以怎么都没有办法优化,矩阵快速幂也是$O(n^3)$会爆炸. 但是没有想到另一个转移方程:定义$f[i][j]$表示每天都有值的$i$天,共消费出总值$j$的方 ...

  7. 【10.11校内测试】【优先队列(反悔贪心)】【莫队】【stl的应用??离线处理+二分】

    上次做过类似的题,原来这道还要简单些?? 上次那道题是每天可以同时买进卖出,所以用两个优先队列,一个存买进,一个存卖出(供反悔的队列). 这道题实际上用一个就够了???但是不好理解!! 所以我还是用了 ...

  8. 【10.7校内测试】【队列滑窗】【2-sat】【贪心+栈二分+线段树(noip模拟好题)】【生日祭!】

    比较好想的一道题,直接用队列滑窗,因为扫一遍往队列里加东西时,改变的只有一个值,开桶储存好就行了! #include<bits/stdc++.h> using namespace std; ...

  9. 【10.6校内测试】【小模拟】【hash+线段树维护覆盖序列】

    一开始看到题就果断跳到T2了!!没想到T2才是个大坑,浪费了两个小时QAQ!! 就是一道小模拟,它怎么说就怎么走就好了! 为什么要用这么多感叹号!!因为统计答案要边走边统计!!如果每个数据都扫一遍20 ...

随机推荐

  1. 聊天室(上篇)GatewayWorker 基础

    前言 本文的目的是基于 GatewayWorker 官方手册,梳理一次 GatewayWorker,并在实践中与 MVC 框架整合的思路(附最终的项目源码).如果你已经理解了整合这一块儿的知识,那么就 ...

  2. jQuery-对标签元素 文本操作-属性操作-文档的操作

    一.对标签元素文本操作 1.1 对标签中内容的操作 // js var div1 = document.getElementById("div1"); div1.innerText ...

  3. 两行代码搞定js对象深浅拷贝

    有一段时间没有更新博客了,忙于工作.2018年刚过去,今天来开启2018第一篇博文.好了,咱们步入正题. 先上代码 /** * 遍历对象 * 1.判断是不是原始值 * 2.判断是数组还是对象 * 3. ...

  4. mac idea内存溢出

    VM options: -mx2048m -XX:MaxPermSize=2048m -Drebel.spring_plugin=true -Drebel.hibernate_plugin=true

  5. Centos简介

    Centos作为主流的一种Linux操作系统,以后项目中,比如后期Redis,以及部署一些项目,会把Centos作为服务器操作系统,我们选用Centos,主要是免费,以及稳定. Centos详细介绍, ...

  6. 20155225 实验三《敏捷开发与XP实践》实验报告

    20155225 实验三<敏捷开发与XP实践>实验报告 一.使用工具(Code->Reformate Code)把代码重新格式化 IDEA里的Code菜单有很多实用的功能可以帮助我们 ...

  7. 二进制方式部署Kubernetes 1.6.0集群(开启TLS)

    本节内容: Kubernetes简介 环境信息 创建TLS加密通信的证书和密钥 下载和配置 kubectl(kubecontrol) 命令行工具 创建 kubeconfig 文件 创建高可用 etcd ...

  8. Aspose.Words 自定义文档模版生成操作类

    /// <summary> /// 操作word通用类 LIYOUMING add 2017-12-27 /// </summary> public class DocHelp ...

  9. HTML5元素1

    文档和元数据元素 元素 说明 类型 HTML5与其他的变化 base 设置相对URL的基础 元数据 无变化 body 表示HTML文档的内容 无 有变化 DOCTYPE 表示HTML文档的开始 无 有 ...

  10. 【LOJ】#2445. 「NOI2011」道路修建

    题解 看完题目我的第一个反应是--要求最小花费的方案?!怎么求??? 然后我把题读完了.好吧. 记录一下size就行,比NOIP普及组还要不如的题= = 代码 #include <iostrea ...