每日好题:原来你也玩三国杀(DP动态规划)

I - 原来你也玩三国杀

Description

小 Q 最近听说 “很多” acmer 都爱上了一款游戏《三国杀》。因为小 Q 是一个初学者,所以想自己先偷偷学习一下,然后惊艳所有人。但又因为小 Q 不屑于使用一般的武将,因为他觉得唯有操作型武将才能显得自己的实力,所以他决定使用操作型武将”大宝”(界徐盛)。

你作为小Q的好盆友,告诉他这个不够秀,并向他推荐了教授(沮授)。其中的一个技能为

  • 渐营(技能):每当你使用和你上一张使用的牌花色相同时,你可以摸一张牌(第一张牌没有上一张)。

但是这个技能摸牌的随机性太大的,很难操作起来,所以小 Q 选择开一点点挂。使得每次触发技能时,小 Q 能够摸到与自己上一张花色相同的牌。

那么如果一直出相同花色的牌就可以一直摸,无穷无尽,很容易让人发现开挂。所以小 Q 就会故意出与上一张不同的花色的牌,导致技能触发不了,这样就能保证可以牌可以出完。但是又不能乱出,因为乱出显不出自己的实力。

假设初始情况下小 Q 有四种花色的牌,数量分别为a,b,c,d (别问为什么初始不是 4,当然是开挂了)。

小 Q 想知道,在手牌用完,并且正好打出了 kk 张牌的情况下,能够有多少种出牌方式。

Input

第一行输入四个整数a,b,c,d (0≤a,b,c,d≤200,a+b+c+d>0) ,代表初始手牌中每种花色的数量。

第二行输入一个整数 T(1≤T≤200) ,代表询问次数。

接下来 T 行,每行输入一个整数 k(0≤k≤1000) ,代表要手牌用完后要打出的牌数。

Output

如果能够在手牌用完的情况下,正好打出 k 张牌,输出 YES,并在下一行输出能够打出 k 张牌的方案数(相同花色的牌视为完全相同,花色排序不同即为不同),答案对 998244353 取模。

否则,输出 NO

Samples

Sample #1
Input 
0 0 2 2
3
3
4
5
Output 

NO
YES
2
YES
4
Sample #2
Input 
1 2 3 4
3
10
20
100
Output

YES
1074
YES
3225222
YES
336967520

Hint

第一个样例中,设四种花色分别为A,B,C,D,那么初始牌数就有两张花色 CC 和两张花色 DD

当 k=3 时,是 NO 。

当 k=4 时,有 CDCD,DCDC 两种出牌方式。

当k=5 时,有 CCDCD,DDCDC,CDDCD,DCCDC 四种出牌方式。

分析:

初始总牌数
ans ,初始有的花色数量 cnt ,需要打出
k 张,差的牌数 n ,最多的一种花色
mx 。两
个模型中,一个是排列相邻不同色模型(
dp 过程也是使用插入法),另一个是
n 个球放进
ans cnt 个盒子模型里。
因为相邻牌不同不能摸牌,所以先找出所有相邻牌不相邻的情况。用
dp
进行求解(
dp
过程见代
码),如果要求出的牌小于初始牌加和,输出 NO ;如果最多的花色 mx
( ans + 1)
mx
还要多,
那么必定构不成 ABAB 类型的排列。
排除之后就是可行的情况了,
ans 距离 k 所相差的牌数可以用 插入法 求解,差 n 张牌,这
n 张牌
可以插在任意一张牌之后(因为牌数不够,所以要在牌之后插入和上一张相同的来凑够
k 张牌,
你会发现即使你插入一些,消耗的牌依旧是一张牌,这里选择插入的牌是排列后面的牌,先用一下
插入进去,因为和上一张相同可以摸一张,相当于没消耗) ( 除了最后每种花色的最后一个,因为
一旦插到最后,就意味着两张花色相同,你可以再摸一张牌,与这是每种花色的最后一张相矛盾 )
所以将这相差的牌用组合数求解, n 个球放进 ans cnt 个盒子里,盒子这里明显是不同的 , 答案
C ans cnt 1
n+ans cnt 1

代码实现:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int Y = 998244353;
#define endl '\n'
const int N = 1010;
ll C[N][N];
ll fac[N];
ll dp[N][N];

void init() {
    C[0][0] = 1;
    for (int i = 1; i <= 1000; i++) {
        C[i][0] = 1;
        for (int j = 1; j <= i; j++)
            C[i][j] = C[i - 1][j] + C[i - 1][j - 1], C[i][j] %= Y;
    }
    fac[0] = 1;
    for (int i = 1; i <= 1000; i++) fac[i] = fac[i - 1] * i % Y;
}

vector<int> arr;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    init();
    int ans = 0;
    int mx = 0;
    int zt, n;
    ll res;
    for (int i = 0; i < 4; i++) {
        cin >> zt;
        ans += zt;
        mx = max(mx, zt);
        if (zt) {
            arr.push_back(zt);
        }
    }
    n = arr.size();
    dp[0][arr[0] - 1] = 1;
    ll sum = arr[0];
    // 每有一个位置(这个位置是指位置之间的缝隙)相邻位置(真位置)都有同色视为该位置有冲突
    for (int i = 1; i < n; sum += arr[i++])  // 每增加一个花色
        for (int j = 0; j < sum; j++)        // 枚举所有冲突的数目
            if (dp[i - 1][j])  // 如果前i-1个花色有j个冲突
                for (int k = 1; k <= arr[i]; k++)  // 枚举这个花色的组数,分成k组,每一组有多少个不重要,重要的是知道多少组就知道了多少位置(缝隙)会产生冲突了
                    for (int u = 0; u <= min(k, j); u++)  //(选择消除u个冲突(将一部分组插入到j个冲突中))
                    {
                        ll tmp = dp [i - 1][j];  // C[j][u]选择u个冲突消除,C[arr[i]-1][k-1]是用隔板法,将arr[i]个分成k份,每一份至少为1,C[sum+1-j][k-u]是没有没有冲突的其余的插入k-u个
                        tmp = ((tmp * C[j][u]) % Y * (C[arr[i] - 1][k - 1] * C[sum + 1 - j][k - u] % Y)) % Y;
                        dp[i][j - u + arr[i] - 1 - (k - 1)] += tmp;
                        dp[i][j - u + arr[i] - 1 - (k - 1)] %= Y;
                    }
    res = dp[n - 1][0];
    int q;
    cin >> q;
    while (q--) {
        int x;
        cin >> x;
        if (x < ans) {
            cout << "NO" << endl;
            continue;
        }
        if (mx > (ans + 1 - mx)) {
            cout << "NO" << endl;
        } else {
            cout << "YES" << endl;
            int ccc = 0;
            ccc = res * C[x - n - 1][ans - n - 1] % Y;
            cout << ccc << endl;
        }
    }

    return 0;
}

新人博主多多关注点赞,以后会更新跟多文章的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/245383.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

性能监控软件:优化系统运行的得力助手

随着科技的飞速发展&#xff0c;企业和组织对于其信息技术基础设施的性能要求也愈发提高。为了确保系统能够高效稳定地运行&#xff0c;性能监控软件成为不可或缺的工具。本文将探讨性能监控软件的主要作用&#xff0c;以及它们在提升系统性能和稳定性方面的关键作用。 1. 实时…

学习MS Dynamics AX 2012编程开发 1. 了解Dynamics AX 2012

在本章中&#xff0c;您将了解开发环境的结构以及Microsoft Dynamics AX中的开发人员可以访问哪些工具。在本书的第一步演练之后&#xff0c;您将很容易理解著名的Hello World代码&#xff0c;您将知道应用程序对象树中的不同节点代表什么。 以下是您将在本章中学习的一些主题…

10、ble_mesh_node服务节点示例

1。手机APP选择名字&#xff0c;点击provisioner App keys&#xff0c;识别&#xff0c;配网。 2。初始化流程&#xff0c; board_init()初始化IO,初始化存储&#xff0c; bluetooth_init()蓝牙初始化&#xff0c;ble_mesh_get_dev_uuid(dev_uuid)蓝牙组网初始化, 3、蓝牙组网初…

MyBatis缓存机制流程分析

前言 在进行分析之前&#xff0c;建议快速浏览之前写的理解MyBatis原理、思想&#xff0c;这样更容易阅读、理解本篇内容。 验证一级缓存 MyBatis的缓存有两级&#xff0c;一级缓存默认开启&#xff0c;二级缓存需要手动开启。 重复读取跑缓存 可以看到&#xff0c;第二次…

[MySQL] MySQL中的索引

文章目录 一、初识索引 1、1 索引的概念 1、2 索引案例 二、认识磁盘 2、1 磁盘结构 2、2 操作系统与磁盘的数据交互 2、3 磁盘随机访问与连续访问 2、4 MySQL与磁盘的数据交互 三、索引的理解 3、1 建立测试表 3、2 为何MySQL与磁盘IO交互是 Page 3、3 理解Page 3、3、1 页目录…

【WSL】Windows下的Linux子系统使用方法指南

▒ 目录 ▒ &#x1f6eb; 导读需求开发环境 1️⃣ WSL安装启用或关闭windows功能安装分发命令行启动Linux 2️⃣ WSL 的基本命令显示帮助列出可用的 Linux 发行版列出已安装的 Linux 发行版检查 WSL 版本更新 WSL通过 PowerShell 或 CMD 运行特定的 Linux 发行版关闭WSL全部服…

Centos7防火墙及端口开启

1、防火墙 1.1、查看防火墙是否开启 systemctl status firewalld 1.2、开启防火墙 firewall-cmd --list-ports 1.3、重启防火墙 firewall-cmd --reload 2、端口 2.1、查看所有已开启的端口号 firewall-cmd --list-ports 2.2、手动开启端口 启动防火墙后&#xff0c;默认没有开…

智能优化算法应用:基于共生生物算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于共生生物算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于共生生物算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.共生生物算法4.实验参数设定5.算法结果6.…

1、springboot项目运行报错

问题1&#xff1a;获取不到配置文件的参数 我的配置文件获取的参数如下&#xff1a; public class Configures{Value("${configmdm.apk.apkName}")private static String apkName;private void setApkName(String apkName) {Configures.apkName apkName;}private …

【亚马逊云科技】通过高性能低延迟对象存储 S3实现网站资源托管

本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 亚马逊云科技开发者社区, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 文章目录 前言1 S3 介绍1.1 优点 2 使用步骤2.1 注册账户2.2 创建存储桶2.2.1 打开控制…

C/C++常见面试题(二)

接前面C/C常见面试题&#xff08;一&#xff09;&#xff0c;继续巩固 目录 1 sizeof和strlen的区别 2 宏定义的陷阱 3 不使用sizeof计算出类型或者变量所占的内存的字节数 4 给定一个数判断是否其是2的N次幂 5 C/C打印所在文件、行号、函数、日期&#xff0c;时间、遵循的…

每日分享,以元旦为题的诗词

元旦佳节即将来临&#xff0c;相信大家都会在朋友圈表达一下自己的情感&#xff0c;不管大家以前是怎么表达的&#xff0c;今天小编给你分享几首以元旦为题的几首诗&#xff0c;喜欢的朋友可以自取&#xff0c;想要更多免费的诗词&#xff0c;请自行百度或小程序搜索&#xff1…

智能守护,数据安全稳中求胜!上海迅软DSE助力家具家电行业引领潮流!

随着中国经济的蓬勃发展&#xff0c;家具家电企业正迎来“精品制造”的时代&#xff0c;业内竞争日益激烈。为了提升产品竞争力、扩大市场占有率&#xff0c;企业亟需加强对自主品牌的安全建设&#xff0c;确保品牌的自主知识产权、产品生产资料以及销售信息等核心数据不受泄漏…

C++二维数组(2)

图形相似度 题目描述&#xff1a; 给出两幅相同大小的黑白图像&#xff08;用0-1矩阵&#xff09;表示&#xff0c;求它们的相似度。 说明&#xff1a;若两幅图像在相同位置上的像素点颜色相同&#xff0c;则称它们在该位置具有相同的像素点。 两幅图像的相似度定义为相同像素…

为什么阿里云不能免费帮用户无限抵御DDoS攻击

DDoS防御需要成本&#xff0c;其中最大的成本就是带宽费用。带宽是阿里云向电信、联通、移动等运营商购买&#xff0c;运营商计算带宽费用时不会把DDoS攻击流量清洗掉&#xff0c;而是直接收取阿里云的带宽费用。阿里云云盾在控制成本的情况下会尽量为阿里云用户免费防御 DDoS攻…

PXI总线测试模块-6935B 微波本振源

6935B 微波本振源 PXI总线测试模块 650MHz~10GHz 01 产品综述 6935B微波本振源采用3U 2槽PXIe结构形式&#xff0c;具有频率范围宽、相位噪声低、频率分辨力高、体积小等优点。其优异的性能使其可适用于通信以及导航设备等众多领域产品的研发、生产、检测与维护中&#xff0c…

neuq-acm预备队训练week 9 P3367 【模板】并查集

题目描述 如题&#xff0c;现在有一个并查集&#xff0c;你需要完成合并和查询操作。 输入格式 解题思路 并查集的用法 AC代码 #include <bits/stdc.h> using namespace std; #define Max 1000001 int zi,xi[Max],yi[Max],Fa[Max]; int find(int x); bool qu(int u,…

垃圾回收 (GC) 在 .NET Core 中是如何工作的?

提起GC大家肯定不陌生&#xff0c;但是让大家是说一下GC是怎么运行的&#xff0c;可能大多数人都不太清楚&#xff0c;这也很正常&#xff0c;因为GC这东西在.NET基本不用开发者关注&#xff0c;它是依靠程序自动判断来释放托管堆的&#xff0c;我们基本不需要主动调用Collect(…

【十】python复合模式

10.1 复合模式简介 在前面的栏目中我们了解了各种设计模式。正如我们所看到的&#xff0c;设计模式可分为三大类:结构型、创建型和行为型设计模式。同时&#xff0c;我们还给出了每种类型的相应示例。然而&#xff0c;在软件实现中&#xff0c;模式并是不孤立地工作的。对于所…

智能故障诊断期刊推荐【中文期刊】

控制与决策 http://kzyjc.alljournals.cn/kzyjc/home 兵工学报 http://www.co-journal.com/CN/1000-1093/home.shtml 计算机集成制造系统 http://jsjjc.soripan.net/ 机械工程学报 http://www.cjmenet.com.cn/CN/0577-6686/home.shtml 太阳能学报 https://www.tynxb.org.c…