【原题】

【题目翻译】

KajKeusaka是个学渣,考试的时候,他一道题也不会做

他的左右桌分别是学霸ModestCoder和学霸Dawn_Chase,虽然学霸并不是题题都会做,但他们做了的题一定都对

现在KajKeusaka想要作弊,但是为了不被监考员抓住,他最多偷看p次,一次能看连续的k道题

给定n和la和lb,分别为题目总数,ModestCoder做出题目数和Dawn_Chase做出题目数,再给出两位学霸做出题目序列,问KajKeusaka最多能偷看到几道题的答案

【输入格式】

第一行三个整数n,p,k(1<=n,p<=1,000 , 1<=k<=min(n,50) )表示有n道题,KajKeusaka可以偷看p次,每次最多看k道题
第二行有一个整数la,表示ModestCoder做出的题数,接下来la个整数表示题号
第三行有一个整数lb,表示Dawn_Chase做出的题数,接下来lb个整数表示题号

【输出格式】

一个整数表示KajKeusaka最多能偷看到几题答案

SampleInputSample~~InputSample  Input

6 2 3
3 1 3 6
4 1 2 5 6

SampleOutputSample~~OutputSample  Output

4

【题意分析】

一道巧妙dp,当然我自己想不出

令dp[i][j][L][R]dp[i][j][L][R]dp[i][j][L][R]表示第iii道题,已经偷看了jjj次,ModestCoder还可以看LLL题,Dawn_Chase还可以看RRR题时最多能偷看到的题数

刷表讨论:

  • 两个人都不偷看
  • 偷看ModestCoder,可以接着上次看下去,也可以用一次次数重新开始看
  • 偷看Dawn_Chase,同上
  • 两人都看,可以(ModestCoder/Dawn_Chase)重新看/重新看,接着看/接着看,接着看/重新看,重新看/接着看

两人做出的题目用布尔型存起来方便提取
枚举i,j,L,Ri,j,L,Ri,j,L,R
先是继承上次的状态dp[i−1][j][L−1][R−1]dp[i-1][j][L-1][R-1]dp[i−1][j][L−1][R−1],用resresres存起来
为什么?因为就算你不看,题目还是会下去,L和R都是要减的
fix(x,y)是将x更新(如果y更大)

if(L)fix(dp[i][j][L−1][max(R−1,0)],res+a[I]);if (L) fix (dp[i][j][L - 1][max (R - 1, 0)], res + a[I]);if(L)fix(dp[i][j][L−1][max(R−1,0)],res+a[I]);

如果左边可以看,不用花费次数直接更新,注意R-1不要越界

fix(dp[i][j+1][k−1][max(R−1,0)],res+a[I]);fix (dp[i][j + 1][k - 1][max (R - 1, 0)], res + a[I]);fix(dp[i][j+1][k−1][max(R−1,0)],res+a[I]);

左边不管可不可以看,直接重新开始看,这要花费一次次数,并且左边剩余次数重置为k-1

if(L)fix(dp[i][j+1][L−1][k−1],res+(a[I]∣b[I]));if (L) fix (dp[i][j + 1][L - 1][k - 1], res + (a[I]~|~ b[I]));if(L)fix(dp[i][j+1][L−1][k−1],res+(a[I] ∣ b[I]));

如果左边可以看,继承左边,重置右边,花费一次次数。a[I]∣b[I]a[I]~|~b[I]a[I] ∣ b[I]是表示两边都看能不能成功看到答案

fix(dp[i][j+2][k−1][k−1],res+(a[I]∣b[I]));fix (dp[i][j + 2][k - 1][k - 1], res + (a[I]~ |~ b[I]));fix(dp[i][j+2][k−1][k−1],res+(a[I] ∣ b[I]));

不管两边能不能看,暴力重置,花费两次次数

if(LandR)fix(dp[i][j][L−1][R−1],res+(a[I]∣b[I]));if (L ~and~ R) fix (dp[i][j][L - 1][R - 1], res + (a[I] ~|~ b[I]));if(L and R)fix(dp[i][j][L−1][R−1],res+(a[I] ∣ b[I]));

如果两边都可以看,再好不过,不需要花费次数

再算上右边的镜像模式,这样我们就转移完了,ansansans就是所有情况打擂台

但是这样会mle,发现iii这维完全可以滚动掉。

还有tle的风险,但是如果p∗k&gt;=n∗2p*k&gt;=n*2p∗k>=n∗2,那么就全部偷看呗,不看白不看,直接两边每次都看,特判输出。

Code:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
#define rep(x,a,b) for (register int x = a; x <= b; x++)
#define MAXN 1005
#define MAXM 60
using namespace std;int dp[2][MAXN][MAXM][MAXM], a[MAXN], b[MAXN], n, m, k, l, r, ans;inline void fix (int &a, int b) {a = max (a, b);}inline int read () {register int s = 0, w = 1;register char ch = getchar ();while (! isdigit (ch)) {if (ch == '-') w = -1; ch = getchar ();}while (isdigit (ch)) {s = (s << 3) + (s << 1) + (ch ^ 48); ch = getchar ();}return s * w;
}int main () {n = read (), m = read (), k = read ();l = read (); rep (i, 1, l) a[read ()] = 1;r = read (); rep (i, 1, r) b[read ()] = 1;if (m * k >= n * 2) {rep (i, 1, n) ans += a[i] | b[i];printf ("%d\n", ans); return 0;}memset (dp, -0x3f3f3f, sizeof dp), dp[0][0][0][0] = 0;rep (I, 1, n) {int i = I % 2, last = (I + 1) % 2;memset (dp[i], -0x3f3f3f, sizeof dp[i]);rep (j, 0, m) rep (L, 0, k) rep (R, 0, k) {int res = dp[last][j][L][R];fix (dp[i][j][max (L - 1, 0)][max (R - 1, 0)], res);if (L) fix (dp[i][j][L - 1][max (R - 1, 0)], res + a[I]);if (L) fix (dp[i][j + 1][L - 1][k - 1], res + (a[I] | b[I]));if (R) fix (dp[i][j][max (L - 1, 0)][R - 1], res + b[I]);if (R) fix (dp[i][j + 1][k - 1][R - 1], res + (a[I] | b[I]));if (L && R) fix (dp[i][j][L - 1][R - 1], res + (a[I] | b[I]));fix (dp[i][j + 1][k - 1][max (R - 1, 0)], res + a[I]);fix (dp[i][j + 1][max (L - 1, 0)][k - 1], res + b[I]);fix (dp[i][j + 2][k - 1][k - 1], res + (a[I] | b[I]));}}rep (j, 0, m) rep (L, 0, k) rep (R, 0, k) fix (ans, dp[n % 2][j][L][R]);printf ("%d\n", ans);return 0;
}

[CF796E Round#408 Div.2]Exam Cheating——[计数DP]相关推荐

  1. Ivan the Fool and the Probability Theory-Codeforces Round #594 (Div. 2)-C题(dp+思维)

    Ivan the Fool and the Probability Theory-Codeforces Round #594 (Div. 2)-C题(dp+思维) time limit per tes ...

  2. Codeforces Round #408 (Div. 2)

    C. Bank Hacking 题目大意:给出一棵n个节点的树,每个节点有一个权值,删掉一个点的代价为当前这个点的权值,并且会使其相邻点和距离为2且中间隔着未被删除的点的点权值加1,现在选一个点开始删 ...

  3. Codeforces Round #743 (Div. 2) E. Paint 区间dp + 暴力

    传送门 文章目录 题意: 思路: 题意: 给你一个有nnn个像素的图像,每个像素都有一个颜色aia_iai​,保证每种颜色的图像不会超过202020个.你现在每次可以选择一个颜色,并选择一段连续的像素 ...

  4. Codeforces Round #709 (Div. 1) C. Skyline Photo dp + 单调栈优化

    传送门 文章目录 题意: 思路: 题意: 思路: 首先一个非常明显的dpdpdp式子就是f[i]=max(f[j]+val(j+1,i))f[i]=max(f[j]+val(j+1,i))f[i]=m ...

  5. Codeforces Round #627 (Div. 3) E. Sleeping Schedule dp

    传送门 文章目录 题意: 思路: 题意: 给你一天hhh小时,初始时间是000,每天可以使时间+ai+a_i+ai​或者+ai−1+a_i-1+ai​−1,问最多可以让多少天的时间在[l,r][l,r ...

  6. Codeforces Round #717 (Div. 2) D(倍增dp)

    Codeforces Round #717 (Div. 2) D 题意:n个数 q个询问,每一个询问有l和r,问你l到r这段区间中最少能分成几段,每一段中的数都是互质的. 思路:首先预处理出每一个点向 ...

  7. Codeforces Round #408 (Div. 2)-C. Bank Hacking-(三种方法)分类讨论,二分,集合

    补题速度太慢了,这样可不行啊. 代码里都有解释. 看别人代码有三种写法 set,分类,和二分. 这是个是用分类思想写的, #include <bits/stdc++.h> using na ...

  8. 思维dp ---- Codeforces Round #711 (Div. 2) - C. Planar Reflections[dp/记忆化搜索]

    题目链接 题目大意: 就是给你n个平面和一个寿命为k的衰变粒子.开始粒子从左向右飞行,粒子每经过一个平面就会产生一个副本粒子,这个副本粒子比原粒子的寿命少1,即为k-1,并且飞行方向是原粒子的反方向. ...

  9. Codeforces Round #319 (Div. 2)B. Modulo Sum DP

                                                             B. Modulo Sum time limit per test 2 seconds ...

最新文章

  1. AngularJs $resource 高大上的数据交互
  2. HTML 杨辉三角,杨辉三角 - 哼哼哈嘿 - OSCHINA - 中文开源技术交流社区
  3. pytorch 计算相似度,相关系数
  4. [LintCode] Single Number 单独的数字
  5. 运维软件PE工具箱下载附制作、安装教程
  6. flash的Socket通讯沙箱和安全策略问题
  7. python excel模板 插件_python脚本——自动推送txt,EXCEL等文件模板
  8. Java中的代理设计模式
  9. Linux系统用户账号的管理技巧
  10. 阿里云助力浙江大学信息化建设,以实时数据驱动校园智能管理
  11. python hack库_常用的Python库
  12. 梦幻西游物价稳定的服务器,梦幻西游:三界功绩对服务器点卡比例的影响,鬼区比例比火区高...
  13. MMOCR: OpenMMLab 全流程的文字检测识别理解工具箱
  14. Java备份Oracle数据库
  15. Java游戏开发中应始终坚持的10项基本原则
  16. 数据模型 同比 环比_同比和环比计算公式?
  17. Windows设置电脑每天自动重启
  18. Tushare股票数据全生命周期MACD等指标动态获取计算-前复权
  19. secureCRT 99%人喜欢的背景配置(超爱)
  20. 关于 TRTC (实时音视频通话模式)在我司的实践

热门文章

  1. 计算机方面的英语文章300字,关于电脑作文300字5篇
  2. 使用js定时器实现倒计时功能
  3. 联邦学习实战-1:用python从零开始实现横向联邦学习
  4. 4-9-6 tf.keras入门(附带复现cvpr论文流程与代码)
  5. 一点透视,二点透视,三点透视的理解
  6. 支小蜜智慧食堂管理系统,聚合支付功能助力食堂支付
  7. 【计算广告】移动设备 效果类广告 归因方式
  8. Orleans 2.0 官方文档 —— 4.8.1 Grains - Grain持久化 - grain持久化的目标
  9. 基于ThinkPHP框架开发的漂亮的家装修公司网站PHP源码
  10. rgw bucket reshard流程