热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

[2022天梯赛]教科书般的亵渎【记忆化搜索】【剪枝】

题目描述:$n$张牌每个牌有权值$a_i$,要求选择$k$次,每次让牌的权值减一,使得牌的权值形成从$1$开始的连续整数(不含$0$).$n,k,ai\leq50$分析:先考虑朴素

题目描述:

$n$张牌每个牌有权值$a_i$,要求选择$k$次,每次让牌的权值减一,使得牌的权值形成从$1$开始的连续整数(不含$0$).

$n,k,ai \leq 50$

分析:

先考虑朴素dp,先将$a_i$排序,$dp[i][S][j]$表示前$i$个数,把$S$这些位填上了,还剩$j$次行动机会的方案数。有

$$dp[i][S][j] -> dp[i+1][S|(1<

考虑剪枝,如果$S$加上后面还没用的$a_i$在操作数最小且形成连续整数的情况下仍然比能用的次数$j$要大,则剪去。用unorderedmap存状态。

代码:

1 #include
2 using namespace std;
3
4 const int maxn = 60;
5 const int mod = 998244353;
6
7 int n,k;
8 int a[maxn];
9
10 int C[maxn][maxn];
11 int ans;
12 unordered_map long long,int> mp[2][52],imm;
13 struct node{
14 int kk;
15 unsigned long long now;
16 };
17 queue q[2];
18
19 bool pd(node fa,int i){
20 int dj = 0;
21 for(;i<=n;i++){
22 unsigned long long pj = (fa.now+1)&(~fa.now);
23 if((1ull<1)

continue;
24 int pp = imm[pj];
25 dj += a[i]-pp;
26 if(dj > fa.kk) return 0;
27 fa.now += pj;
28 }
29 return 1;
30 }
31
32 int fast_pow(int now,int pw){
33 int ans = 1,dt = 1;
34 while(dt <= pw){
35 if(dt & pw) ans = 1ll*ans*now%mod;
36 dt<<=1;
37 now = 1ll*now*now%mod;
38 }
39 return ans;
40 }
41
42 int cnt = 0;
43 void dfs(int now,unsigned long long st,int num,int way){
44 if(now > n){
45 if(num != 0) return;
46 int flag = imm.count(st+1);
47 if(!flag) return;
48 ans += way;
49 if(ans >= mod) ans -= mod;
50 }else{
51 for(int i=a[now];i>=1;i--){
52 if(a[now]-i > num) break;
53 unsigned long long bt = st|(1ull<1);
54 int sz = num-(a[now]-i);
55 int tms = 1ll*way*C[num][a[now]-i]%mod;
56 int zz = (now+1)&1;
57 if(now == n){dfs(now+1,bt,sz,tms);continue;}
58 if(!pd((node){sz,bt},now+1)) continue;
59 if(mp[zz][sz].count(bt)){
60 mp[zz][sz][bt]=(mp[zz][sz][bt]+tms)%mod;
61 }else {
62 q[zz].push((node){sz,bt});
63 mp[zz][sz][bt] = tms;
64 }
65 }
66 }
67 }
68
69
70 int main(){
71 ios::sync_with_stdio(false);
72 cin >> n >> k;
73 for(int i=0;i<=50;i++){
74 unsigned long long u = 1ull<<i;
75 imm[u] = i+1;
76 }
77 for(int i=0;i<=k;i++){
78 C[i][0] = C[i][i] = 1;
79 for(int j=1;j1][j-1]+C[i-1][j])%mod;
80 }
81 for(int i=1;i<=n;i++) cin >> a[i];
82 sort(a+1,a+n+1);
83 mp[1][k][0] = 1; q[1].push((node){k,0});
84 for(int i=1;i<=n;i++){
85 for(int j=0;j<=k;j++) mp[(i&1)^1][j].clear();
86 //cnt=0;
87 while(!q[i&1].empty()){
88 //cnt++;
89 node kd = q[i&1].front(); q[i&1].pop();
90 dfs(i,kd.now,kd.kk,mp[i&1][kd.kk][kd.now]);
91 }
92 //cout<
93 }
94 cout<<1ll*ans*fast_pow(fast_pow(n,k),mod-2)%mod<<endl;
95 return 0;
96 }

View Code

 



推荐阅读
  • Python包管理工具pip的使用指南
    本文详细介绍了如何使用pip进行Python包的安装、管理和常见问题的解决方法,特别针对国内用户提供了优化建议。 ... [详细]
  • PostgreSQL 最新动态 —— 2022年4月6日
    了解 PostgreSQL 社区的最新进展和技术分享 ... [详细]
  • 本文将详细介绍如何在没有显示器的情况下,使用Raspberry Pi Imager为树莓派4B安装操作系统,并进行基本配置,包括设置SSH、WiFi连接以及更新软件源。 ... [详细]
  • 如何使用 CleanMyMac X 2023 激活码解锁完整功能
    本文详细介绍了如何使用 CleanMyMac X 2023 激活码解锁软件的全部功能,并提供了一些优化和清理 Mac 系统的专业建议。 ... [详细]
  • 本文详细介绍了头条搜索引擎对网站内容的抓取、解析及索引过程,探讨了收录量与索引量的区别,并提供了实用工具和技巧来监控网站的收录情况。通过这些信息,网站管理员可以更好地理解搜索引擎的工作机制,优化网站内容以提高其在搜索结果中的可见性。 ... [详细]
  • 了解计算机的序列号和主板型号对于多种用途至关重要。本文将详细介绍如何使用命令提示符和第三方工具,在Windows 10系统中轻松获取这些关键硬件信息。 ... [详细]
  • Mongoose 5.12.10 发布:MongoDB 异步对象模型工具的新特性与修复
    Mongoose 是一款专为异步环境设计的 MongoDB 对象模型工具,支持 Promise 和回调函数。最新版本 Mongoose 5.12.10 带来了多项修复和改进,包括查询选项中的默认值设置、嵌入式判别器填充、以及 TypeScript 定义文件的优化。 ... [详细]
  • 配置PHPStudy环境并使用DVWA进行Web安全测试
    本文详细介绍了如何在PHPStudy环境下配置DVWA( Damn Vulnerable Web Application ),并利用该平台进行SQL注入和XSS攻击的练习。通过此过程,读者可以熟悉常见的Web漏洞及其利用方法。 ... [详细]
  • 深入剖析JVM垃圾回收机制
    本文详细探讨了Java虚拟机(JVM)中的垃圾回收机制,包括其意义、对象判定方法、引用类型、常见垃圾收集算法以及各种垃圾收集器的特点和工作原理。通过理解这些内容,开发人员可以更好地优化内存管理和程序性能。 ... [详细]
  • 搭建Jenkins、Ant与TestNG集成环境
    本文详细介绍了如何在Ubuntu 16.04系统上配置Jenkins、Ant和TestNG的集成开发环境,涵盖从安装到配置的具体步骤,并提供了创建Windows Slave节点及项目构建的指南。 ... [详细]
  • 智能投顾机器人:创业者如何应对新挑战?
    随着智能投顾技术在二级市场的兴起,针对一级市场的智能投顾也逐渐崭露头角。近日,一款名为阿尔妮塔的人工智能创投机器人正式发布,它将如何改变投资人的工作方式和创业者的融资策略? ... [详细]
  • 本文介绍如何在Java中实现一个罗马数字计算器,重点在于如何通过循环和字符验证确保用户输入合法。我们将探讨创建一个方法来检查字符串中的非法字符,并使用循环不断提示用户输入,直到输入符合要求。 ... [详细]
  • Python3 中使用 lxml 模块解析 XPath 数据详解
    XPath 是一种用于在 XML 文档中查找信息的路径语言,同样适用于 HTML 文件的搜索。本文将详细介绍如何利用 Python 的 lxml 模块通过 XPath 技术高效地解析和抓取网页数据。 ... [详细]
  • 解决Spring Boot项目创建失败的问题
    在尝试创建新的Spring Boot项目时遇到了一些问题,具体表现为在项目创建过程中的两个关键步骤出现错误。本文将详细探讨这些问题及其解决方案。 ... [详细]
  • 本文探讨了如何通过一系列技术手段提升Spring Boot项目的并发处理能力,解决生产环境中因慢请求导致的系统性能下降问题。 ... [详细]
author-avatar
小秋学长
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有