【10.5校内测试】【DP】【概率】


转移都很明显的一道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】【概率】的更多相关文章
- 【10.17校内测试】【二进制数位DP】【博弈论/预处理】【玄学(?)DP】
Solution 几乎是秒想到的水题叻! 异或很容易想到每一位单独做贡献,所以我们需要统计的是区间内每一位上做的贡献,就是统计区间内每一位是1的数的数量. 所以就写数位dp辣!(昨天才做了数字统计不要 ...
- 【10.31校内测试】【组合数学】【记忆化搜索/DP】【多起点多终点二进制拆位Spfa】
Solution 注意取模!!! Code #include<bits/stdc++.h> #define mod 1000000007 #define LL long long usin ...
- 【10.29校内测试】【线段树】【DP】【二进制Trie树求最小值最大】
Solution 标程太暴力惹QAQ 相当于是26棵线段树的说QAQ 不过我写了另一种写法,从大到小枚举每一个字母,标记字典序在这个字母之上的位置为1,每次都建一棵线段树,维护1的数量,即区间和. 修 ...
- 【10.26校内测试】【状压?DP】【最小生成树?搜索?】
Solution 据说正解DP30行??? 然后写了100行的状压DP?? 疯狂特判,一算极限时间复杂度过不了aaa!! 然而还是过了....QAQ 所以我定的状态是待转移的位置的前三位,用6位二进制 ...
- 【10.4校内测试】【轮廓线DP】【中国剩余定理】【Trie树+博弈】
考场上几乎是一看就看出来轮廓线叻...可是调了两个小时打死也过不了手出样例!std发下来一对,特判对的啊,转移对的啊,$dp$数组竟然没有取max!!! 某位考生当场死亡. 结果下午又请了诸位dala ...
- 【10.3校内测试【国庆七天乐!】】【DP+组合数学/容斥】【spfa多起点多终点+二进制分类】
最开始想的暴力DP是把天数作为一个维度所以怎么都没有办法优化,矩阵快速幂也是$O(n^3)$会爆炸. 但是没有想到另一个转移方程:定义$f[i][j]$表示每天都有值的$i$天,共消费出总值$j$的方 ...
- 【10.11校内测试】【优先队列(反悔贪心)】【莫队】【stl的应用??离线处理+二分】
上次做过类似的题,原来这道还要简单些?? 上次那道题是每天可以同时买进卖出,所以用两个优先队列,一个存买进,一个存卖出(供反悔的队列). 这道题实际上用一个就够了???但是不好理解!! 所以我还是用了 ...
- 【10.7校内测试】【队列滑窗】【2-sat】【贪心+栈二分+线段树(noip模拟好题)】【生日祭!】
比较好想的一道题,直接用队列滑窗,因为扫一遍往队列里加东西时,改变的只有一个值,开桶储存好就行了! #include<bits/stdc++.h> using namespace std; ...
- 【10.6校内测试】【小模拟】【hash+线段树维护覆盖序列】
一开始看到题就果断跳到T2了!!没想到T2才是个大坑,浪费了两个小时QAQ!! 就是一道小模拟,它怎么说就怎么走就好了! 为什么要用这么多感叹号!!因为统计答案要边走边统计!!如果每个数据都扫一遍20 ...
随机推荐
- 【技巧总结】Penetration Test Engineer[5]-Operating System Security(SQL Server、MySQL提权)
4.数据库安全基础 4.1.MSSQL 数据库角色权限 sysadmin:执行SQL Server中的任何动作 db_owner:可以执行数据库中技术所有动作的用户 public:数据库的每个合法用户 ...
- ASP.net-空白页的问题
protected void Application_Error(object sender, EventArgs e) { ILog log = LogMan ...
- 03.JavaScript简单介绍
一.JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.(客户端执行的语言) N ...
- error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如: tmux: error while loading shared libraries: libevent-1.4.s ...
- vue项目中,Iview打包到生产环境时, woff 字体引用问题
出现这问题的原因是文件路径不对,与webpack有关,解决的办法为: 一.修改webpack.prod.conf.js module: { rules: utils.styleLoaders({ so ...
- java基础61 JavaScript循环语句之while、do...while、for及for...in循环(网页知识)
本文知识点(目录): 1.while循环语句 2.do...while循环语句 3.for循环语句 4.for...in循环语句 5.附录1(with语句) 6.附录2( ...
- [扩展推荐] Laravel 中利用 GeoIP 获取用户地理位置信息
我最近需要一个用户地域检测来设置用户的默认区域和货币.由 Daniel Stainback 创建的 torann/geoip 很好地满足为Laravel 5 项目提供 GeoIP 服务的要求. 这个 ...
- opencv(1)图像处理
2.图像操作 图片裁剪 裁剪是利用array自身的下标截取实现 HSV空间 除了区域,图像本身的属性操作也非常多,比如可以通过HSV空间对色调和明暗进行调节.HSV空间是由美国的图形学专家A. R. ...
- 出现丢包解决方法(ping: sendmsg: Operation not permitted)
故障排查: 早上突然收到nagios服务器check_icmp的报警,报警显示一台网站服务器的内网网络有问题.因为那台服务器挂载了内网的NFS,因此内网的网络就采用nagios的check_icmp来 ...
- bzoj 1899 贪心+dp
思路:这个贪心排顺序我居然没看出来. 吃饭时间长的在前面, 用反证法很容易得出. 剩下的就是瞎dp啦. #include<bits/stdc++.h> #define LL long lo ...