分析

学会新姿势!我们可以通过调整DP顺序来体现选取物品的优先顺序!

显然选取强化牌的最优策略是倍数从高到低,能选就选,最多选\(k-1\)张,选取攻击牌的最优策略是伤害从高到低,尽量少选,但最少选\(1\)张。

我们可以把强化牌从大到小排序,把攻击牌从小到大排序,令\(f[i][j]\)表示考虑了最大的\(i\)张强化牌,其中所有可选的强化牌有\(j\)张的情况的最优策略下的强化倍数和,\(g[i]\)表示考虑了最小的\(i\)张攻击牌,其中所有可选的攻击牌有\(j\)张的情况的最优策略下的伤害和。

状态转移方程如下:

\[f[i][j]=f[i-1][j]+f[i-1][j-1] \times a[i]\ (j \leq k-1)
\]

\[f[i][j]=f[i-1][j]+f[i-1][j-1]\ (j > k-1)
\]

\[g[i][j]=b[i] \times \binom{i-1}{j-1}\ (m-j \geq k-1)
\]

\[g[i][j]=b[i] \times \binom{i-1}{j-1}+g[i-1][j-1]\ (m-j < k-1)
\]

代码

#include <bits/stdc++.h>

#define rin(i,a,b) for(int i=(a);i<=(b);++i)
#define irin(i,a,b) for(int i=(a);i>=(b);--i)
#define trav(i,a) for(int i=head[a];i;i=e[i].nxt)
#define Size(a) (int)a.size()
#define pb push_back
#define mkpr std::make_pair
#define fi first
#define se second
#define lowbit(a) ((a)&(-(a)))
typedef long long LL; using std::cerr;
using std::endl; inline int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
return x*f;
} const int MAXN=3005;
const int MOD=998244353; int n,m,k,a[MAXN],b[MAXN],f[MAXN],g[MAXN];
int fac[MAXN],invf[MAXN]; inline int qpow(int x,int y){
int ret=1,tt=x%MOD;
while(y){
if(y&1)ret=1ll*ret*tt%MOD;
tt=1ll*tt*tt%MOD;
y>>=1;
}
return ret;
} inline int binom(int n,int m){
if(n<0||m<0||n<m)return 0;
return 1ll*fac[n]*invf[n-m]%MOD*invf[m]%MOD;
} void init(){
fac[0]=1;rin(i,1,n)fac[i]=1ll*fac[i-1]*i%MOD;
invf[n]=qpow(fac[n],MOD-2);irin(i,n-1,0)invf[i]=1ll*invf[i+1]*(i+1)%MOD;
} int main(){
n=3000;init();
int T=read();
while(T--){
n=read(),m=read(),k=read();
rin(i,1,n)a[i]=read();
rin(i,1,n)b[i]=read();
std::sort(a+1,a+n+1);
std::sort(b+1,b+n+1);
rin(i,0,m)f[i]=g[i]=0;
f[0]=1,g[0]=0;
irin(i,n,1)irin(j,std::min(n-i+1,m),1){
if(j<=k-1)f[j]=(f[j]+1ll*f[j-1]*a[i])%MOD;
else f[j]=(f[j]+f[j-1])%MOD;
}
rin(i,1,n)irin(j,std::min(i,m),1){
if(m-j<k-1)g[j]=(g[j]+1ll*binom(i-1,j-1)*b[i]+g[j-1])%MOD;
else g[j]=(g[j]+1ll*binom(i-1,j-1)*b[i])%MOD;
}
int ans=0;
rin(i,0,m)ans=(ans+1ll*f[i]*g[m-i])%MOD;
printf("%d\n",ans);
}
return 0;
}

[LOJ2538][PKUWC2018]Slay the Spire:DP的更多相关文章

  1. LOJ2538 PKUWC2018 Slay the Spire DP

    传送门 不想放题面了,咕咕咕咕咕 这个期望明明是用来吓人的,其实要算的就是所有方案的最多伤害的和. 首先可以知道的是,能出强化牌就出强化牌(当然最后要留一张攻击牌出出去),且数字尽量大 所以说在强化牌 ...

  2. [LOJ2538] [PKUWC2018] Slay the Spire

    题目链接 LOJ:https://loj.ac/problem/2538 Solution 计数好题. 首先可以发现这题和期望没关系. 其次对于手上的一套牌,设我们有\(a\)张强化牌,那么: 如果\ ...

  3. LOJ #2538. 「PKUWC 2018」Slay the Spire (期望dp)

    Update on 1.5 学了 zhou888 的写法,真是又短又快. 并且空间是 \(O(n)\) 的,速度十分优秀. 题意 LOJ #2538. 「PKUWC 2018」Slay the Spi ...

  4. loj2538 「PKUWC2018」Slay the Spire 【dp】

    题目链接 loj2538 题解 比较明显的是,由于强化牌倍数大于\(1\),肯定是能用强化牌尽量用强化牌 如果强化牌大于等于\(k\),就留一个位给攻击牌 所以我们将两种牌分别排序,企图计算\(F(i ...

  5. BZOJ.5467.[PKUWC2018]Slay the Spire(DP)

    LOJ BZOJ 洛谷 哪张能力牌能乘攻击啊,太nb了叭 显然如果有能力牌,那么应该选最大的尽可能的打出\(k-1\)张. 然后下面说的期望都是乘总方案数后的,即所有情况的和.然后\(w_i\)统一用 ...

  6. 洛谷 P5299 - [PKUWC2018]Slay the Spire(组合数学+dp)

    题面传送门 hot tea 啊--这种风格及难度的题放在省选 D2T1 左右还是挺喜闻乐见的罢 首先考虑对于固定的 \(m\) 张牌怎样求出最优的打牌策略,假设我们抽到了 \(p\) 张强化牌,攻击力 ...

  7. 题解-PKUWC2018 Slay the Spire

    Problem loj2538 Solution 在考场上当然要学会写暴力,考虑如果手上已经有了\(a\)张攻击牌和\(b\)张强化牌: 首先强化牌会在攻击牌之前用(废话),其次要将两种牌分别从大往小 ...

  8. [PKUWC2018] Slay the spire

    Description 现在有 \(n\) 张强化牌和 \(n\) 张攻击牌: 攻击牌:打出后对对方造成等于牌上的数字的伤害. 强化牌:打出后,假设该强化牌上的数字为 \(x\),则其他剩下的攻击牌的 ...

  9. 【洛谷5299】[PKUWC2018] Slay the Spire(组合数学)

    点此看题面 大致题意: 有\(n\)张强化牌\(a_i\)和\(n\)张攻击牌\(b_i\),每张牌有一个权值(强化牌的权值大于\(1\)),每张强化牌能使所有攻击牌的权值乘上这张强化牌的权值,每张攻 ...

随机推荐

  1. 用Java实现对英文版《飘》的文件读取与写入操作

    从文件读入<飘>的英文版,并将结果输出到文件中 要求一: 实现对英文版<飘>的字母出现次数统计 package File; import java.io.FileInputSt ...

  2. CF 1133C Balanced Team

    题目链接:http://codeforces.com/problemset/problem/1133/C 题目分析 (个人感受:我看错了题目,硬是写了近一个小时!) 这个题目要求一个最长的序列,使得这 ...

  3. HTML(下)

    目录 HTML(下) form表单 表单功能 表单属性 <input>输入标签(文本框)(内联标签) <select>下拉列表标签(内联标签) <textarea> ...

  4. springboot mongodb jpa常用方法整理

    官方文档https://docs.spring.io/spring-data/data-mongodb/docs/current/reference/html/index.html 查询: ***** ...

  5. spring boot 发布自动生成svn版本号

    通过Jenkins构建发布spring boot项目时,常常有需求,需要把Svn的版本号更新到项目的版本上,通过有两种解决方案: 1. 通过shell命令对配置文件中的指定字符进行替换, 如: 配置文 ...

  6. Visual Studio 2010中的js注释

    Visual Studio 2010中的js注释已经很强大了,但怎么才能和调用c#的方法一样容易呢?怎样才能让每个参数都有注释说明呢?底下就是想要的答案. 先上图,如图所示: 其中红色的办法为注释效果 ...

  7. window.location.href 与 window.location.href 的区别

  8. 常用的商业级和免费开源Web漏洞扫描工具

    Scanv 国内著名的商业级在线漏洞扫描.可以长期关注,经常会有免费活动.SCANV具备自动探测发现无主资产.僵尸资产的功能,并对资产进行全生命周期的管理.主动进行网络主机探测.端口探测扫描,硬件特性 ...

  9. mysql explain解析一 extra中的using index,using where,using index condition

    1.简单介绍 using index 和using where只要使用了索引我们基本都能经常看到,而using index condition则是在mysql5.6后新加的新特性,我们先来看看mysq ...

  10. HashMap原理探究

    一.写随笔的原因:HashMap我们在平时都会用,一般面试题也都会问,借此篇文章分析下HashMap(基于JDK1.8)的源码. 二.具体的内容: 1.简介: HashMap在基于数组+链表来实现的, ...