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

news2024/12/23 15:37:19

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;
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

虾皮选品网:如何使用虾皮选品数据软件提升您的选品策略

在虾皮&#xff08;Shopee&#xff09;平台上进行选品时&#xff0c;了解市场趋势、竞争程度和产品潜力是非常重要的。为了帮助卖家更好地分析虾皮市场&#xff0c;并为选品和运营策略提供有力支持&#xff0c;有一些数据软件和工具可以派上用场。本文将介绍一些建议使用的虾皮…

Kafka-集群架构设计

Kafka的Zookeeper元数据梳理 zookeeper整体数据 Kafka将状态信息保存在Zookeeper中&#xff0c;这些状态信息记录了每个Kafka的Broker服务与另外的Broker服务 有什么不同。通过这些差异化的功能&#xff0c;共同体现出集群化的业务能力。这些数据&#xff0c;需要在集群中各个…

DS二分查找_搜索二维矩阵(纯二分查找写法)

本题我写了两个方法&#xff0c;一个是的时间复杂度,就是本文章一个mn时间复杂度&#xff0c;这个比较简单&#xff0c;如果不会二分法可以看这篇文章 Description 使用二分查找法来判断m*n矩阵matrix中是否存在目标值target。 该矩阵有以下特性&#xff1a; 1. 每行中的整数…

智物发布MT6877平台无线AR智能眼镜参考设计,推动下一代无线AR发展

随着增强现实(AR)技术的不断发展&#xff0c;有线AR眼镜在连接和使用方面存在一些限制。为了解决这些问题&#xff0c;无线AR智能眼镜的推出势在必行。 新一代无线AR智能眼镜采用了天玑900&#xff08;MT6877&#xff09;平台作为参考设计&#xff0c;搭载了2.4GHz的八核处理器…

【每日一题】用邮票贴满网格图

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;二维前缀和二维差分 写在最后 Tag 【二维前缀和】【二维差分】【矩阵】【2023-12-14】 题目来源 2132. 用邮票贴满网格图 题目解读 在 01 矩阵中&#xff0c;判断是否可以用给定尺寸的邮票将所有 0 位置都覆盖住&…

飞轮储能一次调频并网三机九节点系统,虚拟惯性和下垂控制,也可加入虚拟同步机VSG控制,飞轮储能容量可调,系统频率50Hz,离散模型

5MW飞轮储能一次调频并网三机九节点系统&#xff0c;虚拟惯性和下垂控制&#xff0c;也可加入虚拟同步机VSG控制&#xff0c;飞轮储能容量可调&#xff0c;系统频率50Hz&#xff0c;离散模型&#xff0c;仿真运行速度快。 飞轮储能变流器采用双PWM环设计&#xff0c;并网电压电…

CleanMyMac2024绿色免费激活码序列号

2024CleanMyMac免费mac下载版是一款简单实用的PC清洁管理工具&#xff0c;电脑刚装完系统的时候运行速度超级快&#xff0c;随着时间的推移&#xff0c;你会发现越来越慢&#xff0c;经常会反应卡顿&#xff0c;越来越多的垃圾文件占用了你的磁盘空间&#xff0c;各种过时的日志…

数据结构学习 12字母迷宫

dfs 回溯 剪枝 这个题和dfs有关&#xff0c;但是我之前没有接触过&#xff0c;我看了这一篇很好的文章&#xff0c;看完之后写的答案。 我觉得很好的总结&#xff1a; dfs模板 int check(参数) {if(满足条件)return 1;return 0; }void dfs(int step) {判断边界{相应操作}尝试…

HPV为什么无症状?皮肤性病科专家谭巍解读具体原因

HPV&#xff0c;即人乳头瘤病毒&#xff0c;是一种常见的性传播疾病。然而&#xff0c;并不是所有感染HPV的人都会出现症状。为什么有的人感染HPV没有症状呢? 首先&#xff0c;需要了解的是&#xff0c;HPV感染是一种非常常见的现象。事实上&#xff0c;大约有80%的性活跃人群…

SLAM学习——相机模型(针孔+鱼眼)

针孔相机模型 针孔相机模型是很常用&#xff0c;而且有效的模型&#xff0c;它描述了一束光线通过针孔之后&#xff0c;在针孔背面投影成像的关系&#xff0c;基于针孔的投影过程可以通过针孔和畸变两个模型来描述。 模型中有四个坐标系&#xff0c;分别为world&#xff0c;c…

智能指针管理“newed对象”

为什么要有智能指针&#xff1f; 指针智能是管理管理动态内存分配对象的一种机制。它提供了自动管理内存&#xff0c;避免常见内存泄漏和悬空指针。 对于上述Func函数的操作&#xff0c;一不小心就会产生很多问题。 p1 new时候抛异常 什么都不做p2 new时候抛异常 p1需要被清理…

SpringBoot 接口实现幂等性,实现的四种方案!

什么是接口幂等性 在HTTP/1.1中&#xff0c;对幂等性进行了定义。它描述了一次和多次请求某一个资源对于资源本身应该具有同样的结果&#xff08;网络超时等问题除外&#xff09;&#xff0c;即第一次请求的时候对资源产生了副作用&#xff0c;但是以后的多次请求都不会再对资…

3-分布式存储之Ceph

任务背景 虽然使用了分布式的glusterfs存储, 但是对于爆炸式的数据增长仍然感觉力不从心。对于大数据与云计算等技术的成熟, 存储也需要跟上步伐. 所以这次我们选用对象存储. 任务要求 1, 搭建ceph集群 2, 实现对象存储的应用 任务拆解 1, 了解ceph 2, 搭建ceph集群 3, 了…

【docker】 docker部署minio对象存储并用rclone同步

docker部署minio对象存储并用rclone同步 1.什么是minio&#xff1f; minio是一个开源的对象存储服务器&#xff0c;兼容S3协议。 官网&#xff1a;https://min.io/ 官方在开源的基础上也提供云端S3服务&#xff0c;分为个人和企业&#xff0c;有不同的收费标准。 1.1 自建对…

SQL注入【sqli靶场第15-19关】(四)

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将信息做其他用途&#xff0c;由Ta承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 接上文&#xff1a;SQL注入【sqli靶场第11-14关】(三) …

Liunx系统安装mysql数据库

一、环境检查 1、检查本地是否安装MySQL服务&#xff1b; 2、下载MySQL安装包&#xff1b; 3、查看下载的文件 4、解压MySQL文件 5、安装MySQL 6、检查MySQL数据库安装情况 7、启动MySQL 8、查看MySQL安装初始密码 9、登录MySQL 10、设置远程授权 11、关闭防火墙

智慧灯杆技术应用分析

智慧灯杆是指在传统灯杆的基础上&#xff0c;通过集成多种先进技术实现城市智能化管理的灯杆。智慧灯杆技术应用的分析如下&#xff1a; 照明功能&#xff1a;智慧灯杆可以实现智能调光、时段控制等功能&#xff0c;根据不同的需求自动调节照明亮度&#xff0c;提高照明效果&am…

Pytorch学习概述

目录 学习目标人工智能1. 智能&#xff08;Intelligence&#xff09;1.1 人类智能1.2 机器学习&#xff08;人工智能&#xff09;1.3 深度学习1.4 学习系统的发展历程传统的机器学习策略 2. 传统机器学习算法的一些挑战3. 神经网络的简要历史3.1 Back Propagation&#xff08;反…

Java数据类型相关

数据类型 Java有哪些数据类型 定义&#xff1a;Java语言是强类型语言&#xff0c;对于每一种数据都定义了明确的具体的数据类 型&#xff0c;在内存中分配了不同大小的内存空间。 分类&#xff1a; 基本数据类型 数值型 整数类型(byte,short,int,long) 浮点类型(float,dou…

一键提取微信聊天记录,生成HTML、Word文档永久保存,还能生成微信年度聊天报告

不知道生活中你有没有遇到过这种情况&#xff0c;聊天记录不完整&#xff0c;有的在手机上&#xff0c;有的在电脑上&#xff0c;搜索起来很烦。那有没有一种办法可以把微信聊天记录统一呢&#xff1f;当然是有的。下面&#xff0c;就让我们一起来看一下怎么操作。 先看效果 操…