即求所有情况的最大伤害之和。容易发现应该先打强化牌,至少打一张攻击牌。同样显然的是强化牌和攻击牌都应该按从大到小的顺序打。进一步可以发现,只要还有强化牌,就应该使用(当然至少留一次攻击的机会)。

  于是将强化牌和攻击牌各自从大到小排序。显然可以将其分开考虑。对强化牌,设f[i][j]为前i张牌抽到j张并打出的强化倍数之和,则显然有f[i][j]=f[i-1][j]+f[i-1][j-1]·w[i]。这样就搞定了强化牌可以打完的情况。同时设g[i]为抽i张打出k-1张的强化倍数之和,dp过程中通过f数组计算,注意避免重复。对于攻击牌也进行类似dp。然后枚举两种牌各抽了几张合并一下答案即可。注意细节。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 3010
#define P 998244353
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}
int T,n,m,k,a[N],b[N],f[2][N][N],g[2][N],C[N][N],h[N];
int main()
{
#ifndef ONLINE_JUDGEfreopen("bzoj5467.in","r",stdin);freopen("bzoj5467.out","w",stdout);const char LL[]="%I64d\n";
#elseconst char LL[]="%lld\n";
#endifT=read();while (T--){n=read(),m=read(),k=read();int lim=min(k-1,n);C[0][0]=1;for (int i=1;i<=n;i++){C[i][0]=C[i][i]=1;for (int j=1;j<n;j++)C[i][j]=(C[i-1][j-1]+C[i-1][j])%P;}memset(f,0,sizeof(f));memset(g,0,sizeof(g));memset(h,0,sizeof(h));for (int i=1;i<=n;i++) a[i]=read();for (int i=1;i<=n;i++) b[i]=read();sort(a+1,a+n+1),reverse(a+1,a+n+1);sort(b+1,b+n+1),reverse(b+1,b+n+1);f[0][0][0]=1;for (int i=1;i<=n;i++){f[0][i][0]=1;for (int j=1;j<=lim;j++)f[0][i][j]=(f[0][i-1][j]+1ll*f[0][i-1][j-1]*a[i])%P;if (lim==0) for (int j=0;j<=n;j++) g[0][j]=C[n][j];elsefor (int j=lim;j<=n;j++)g[0][j]=(g[0][j]+1ll*f[0][i-1][lim-1]*a[i]%P*C[n-i][j-lim])%P;}for (int i=1;i<=n;i++){for (int j=1;j<=m;j++)f[1][i][j]=(f[1][i-1][j]+f[1][i-1][j-1]+1ll*b[i]*C[i-1][j-1])%P;for (int j=m-k+1;j<=n;j++)g[1][j]=(g[1][j]+(f[1][i-1][j-(m-k)-1]+1ll*b[i]*C[i-1][j-(m-k)-1])%P*C[n-i][m-k])%P;}for (int i=1;i<=min(n,m);i++)for (int j=1;j<=n;j++)h[i]=(h[i]+1ll*b[j]*C[n-j][i-1])%P;/*for (int i=0;i<=n;i++) cout<<f[0][n][i]<<' ';cout<<endl;for (int i=0;i<=n;i++) cout<<g[0][i]<<' ';cout<<endl;for (int i=0;i<=n;i++) cout<<f[1][n][i]<<' ';cout<<endl;for (int i=0;i<=n;i++) cout<<g[1][i]<<' ';cout<<endl;for (int i=0;i<=n;i++) cout<<h[i]<<' ';cout<<endl;*/int ans=0;for (int i=max(0,m-n);i<=min(n,m);i++)if (i<=lim) ans=(ans+1ll*f[0][n][i]*g[1][m-i])%P;//抽了i张强化牌 全部出完 剩余m-i张攻击牌 选m-k张不出else ans=(ans+1ll*g[0][i]*h[m-i])%P;//抽了i张强化牌 选lim张出 剩余m-i张攻击牌 出1张printf("%d\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/Gloid/p/10136466.html

BZOJ5467 PKUWC2018Slay the Spire(动态规划)相关推荐

  1. DP动态规划-爬塔(双层dp)

    DP动态规划-爬塔(双层dp) 比赛来源:牛客 - 中国计量大学现代科技学院第四届"中竞杯"程序设计校赛 题目--------F题 description: 高川最喜欢的游戏当属 ...

  2. 伍六七带你学算法 动态规划 ——不同路径

    力扣 62. 不同路径 难度 中等 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格 ...

  3. 由动态规划计算编辑距离引发的思考

    简单介绍 编辑距离算法: https://www.cnblogs.com/BlackStorm/p/5400809.html https://wizardforcel.gitbooks.io/the- ...

  4. LeetCode 10. Regular Expression Matching python特性、动态规划、递归

    前言 本文主要提供三种不同的解法,分别是利用python的特性.动态规划.递归方法解决这个问题 使用python正则属性 import reclass Solution2:# @return a bo ...

  5. 【动态规划】Part1

    1. 硬币找零 题目描述:假设有几种硬币,如1.3.5,并且数量无限.请找出能够组成某个数目的找零所使用最少的硬币数. 分析:   dp [0] = 0            dp [1] = 1 + ...

  6. 2016.4.2 动态规划练习--讲课整理

    1.codevs1742 爬楼梯  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 小明家外面有一个长长的楼梯,共N阶.小明的腿 ...

  7. 算法设计与分析第4章 动态规划(二)【DP序列问题】

    第3章 动态规划(二)[DP序列问题] 3.2 DP序列问题 (51nod的动态规划教程很不错,讲解很详细,以下分析来自51nod) 1.矩阵取数问题 给定一个m行n列的矩阵,矩阵每个元素是一个正整数 ...

  8. 算法设计与分析第4章 动态规划(一)【背包问题】

    第3章动态规划(一)[背包问题] 基本思想: 动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,但是经分解得到的子问题往往不是互相独立的.不同子问题的数目常常只有多项式量级.在用 ...

  9. ADPRL - 近似动态规划和强化学习 - Note 7 - Approximate Dynamic Programming

    Note 7 - 近似动态规划 Approximate Dynamic Programming 7. 近似动态规划 (Approximate Dynamic Programming) 7.1 近似架构 ...

最新文章

  1. 模拟真机环境_QFramework 使用指南 2020(八):Res Kit(2)模拟模式与非模拟模式...
  2. 诺丁汉大学高级计算机科学,诺丁汉大学博士生奖学金介绍
  3. 很多人很想知道怎么扫一扫二维码就能打开网站,就能添加联系人,就能链接wifi,今天做个demo(续集)...
  4. 英雄无敌3版的仙剑奇侠传
  5. java sendmessage_SendMessage()复制/剪切/粘贴WM_COPYDATA 0x004A
  6. JDK 8时代的抽象类与接口
  7. 05 MapReduce应用案例02
  8. [Redux/Mobx] Redux怎样设置初始状态?
  9. 经验 | 深度学习中常见的损失函数(loss function)总结
  10. 5999元!OPPO Find X5 Pro 8+256GB版今日首销
  11. [转]微服务轮子项目(27) -MySQL 主从复制、主从切换、主主复制
  12. 输入一行数字、数字之间用空格隔开python_Python 实现一行输入多个数字(用空格隔开)...
  13. 深入理解java8,深入理解Java8新特性与源码剖析
  14. python图片搜索_用Python构建图片处理搜索引擎
  15. 2021中国医疗机器人产业创新大会参会指南
  16. 算法注册机编写扫盲---第三课
  17. java七年_阿里七年Java程序员的总结,献给还在迷茫中的你!
  18. 第四章 姜诸儿意气风发登君位 鲁桓公窝囊枉死彭生手
  19. 【Java百炼成神】双生武魂——HashMap、LinkedHashMap、Hashtable
  20. U盘装系统启动时按F12没有反应的原因之一

热门文章

  1. .git文件夹_将Git存储库中的文件夹转换为全新的存储库
  2. 十二月份找工作好找吗_淘宝美工前景怎么样?好找工作吗?
  3. android实现录像功能吗,Android实现录屏直播(一)ScreenRecorder的简单分析
  4. c语言中缺少link文件夹,c – Cmake找不到使用“link_directories”的库
  5. mvc html根目录,c#-路由到ASP.NET MVC中的根目录
  6. SpringBoot的email发送ssl协议格式
  7. nginx: [emerg] duplicate “log_format“ name “main“ in /usr/local/phpstudy/vhost/sys/nginx/sys.conf:11
  8. 【微信小程序】生成二维码方式
  9. sklearn常用模块
  10. mac mysql 端口被占用_【Docker】安装MySQL彻底解决3306端口占用问题