解题报告-泥路(muddyroad.*)

news/2025/9/28 16:30:36/文章来源:https://www.cnblogs.com/Starpop/p/19117053

泥路(muddyroad.*)

题目背景

yxr 热爱多级跳,而且他十分喜欢在泥路上练习多级跳。

不幸的是,有一天下雨了,yxr 穿着的却是一双新的鞋子。yxr 心疼自己的鞋子,但是又不舍得放弃练习多级跳,于是他决定先勘察泥路。

题目描述

yxr根据他丰富的经验得出了一个结论:泥地可以均等分成 \(N+1\) 部分,从 \(0\) 开始编号,一直编号到 \(n\),设每部分一个单位长度。

每部分泥地可以分成两种情况,积水或者没有积水。由于跳得越远,用的力就越大。yxr 发现,如果自己由远于 \(D_1\) 单位长度的地方跳到没有积水的泥地里面泥地会被破坏;如果自己由远于 \(D_2\) 单位长度的地方跳到有积水的泥地里面泥地里面的水才会溅到 yxr 的鞋子上。幸运的是 yxr 选定的 \(0\) 号泥地没有积水。

yxr 当然不愿意破坏这一片和自己拥有美好感情的泥地,于是他决定自己不会由远于 \(D_1\) 单位长度的地方跳到没有积水的泥地;另外 yxr 也不愿意弄脏自己的新鞋,他也决定不会由远于 \(D_2\) 单位长度的地方跳到有积水的泥地。

于是他自己算了算自己有多少种方法在满足上述条件的情况下,恰好从 \(0\) 号泥地跳到 \(N\) 号泥地,发现方案数 \(K\) 是个奇数,于是他很高兴地练习了起来。

在 yxr 练习完成之后,发现泥地完全干了,但是他很怀念积水的泥地,但是却忘记了哪些地方是有积水的。他努力回忆,记得 \(N\) 部分之中有 \(M\) 部分是积水的,也记得自己曾经算过的方法数 \(K\) 是个奇数,但是不记得是什么了,毕竟方法数很大啊。

于是他想知道,有多少种长度为 \(N+1\) 的泥地,满足恰好 \(M\) 部分积水,且 \(0\) 号泥地没有积水,而且满足 yxr 算过的练习方案数 \(K\) 是奇数。

输入描述

输入仅有四个整数 \(N\)\(M\)\(D_1\)\(D_2\),如题目描述。

输出描述

输出仅包含一个整数,表示方案数,结果对 \(10^9+7\) 取模。

输入输出样例#1

输入样例#1

5 1 2 0

输出样例#1

2

输入输出样例#2

输入样例#2

9 2 3 1

输出样例#2

24

说明/提示

样例#1解释

对于样例一,泥地有如下两种( \(0\) 号位置省略),“\(\text{B}\)”表示有积水,"\(\text{A}\)" 表示没有积水。

\(\text{AAABA}\) 练习方案数为 \(3\)

\(\text{BAAAA}\) 练习方案数为 \(3\)

数据范围

  • 对于 \(20\)% 的数据,\(M=0\)
  • 对于另外 \(20\)% 的数据 \(N \leq 15\)\(M \leq 5\)\(D_1 \leq 5\)
  • 对于 \(60\)% 的数据 \(N \leq 120\)\(M \leq 12\)\(D_1 \leq 10\)
  • 对于 \(70\)% 的数据 \(N \leq 300\)\(M \leq 20\)\(D1 \leq 12\)
  • 对于 \(100\)% 的数据 \(N \leq 500\)\(M \leq 20\)\(D1 \leq 20\)
  • 对于 \(100\)% 的数据 \(20 \geq D1 \geq D2 \geq 0\)

解题报告

神秘状压DP题目,就算补发了一些提示,拼尽全力也只能拿到 \(90 \text{pts}\)

对于求方案数的题目,很容易想到用 DP 求解。显然,最棘手的就是如何在转移的过程中保证跳跃方法数为奇数。

先定义一个函数 \(g(i)=1\)\(0\),表示跳到第 \(i\) 个位置的方案数的奇(\(1\))偶(\(0\))性。

这个函数有什么用?答曰:它可以通过递推来计算出来

下面简单讲讲怎么递推。

显然,跳到第 \(i\) 个位置的方案数由两部分相加:

  • \(i\) 个位置不是水坑时的方案数,等于所有距离不超过 \(D_1\) 的位置的方案和。
  • \(i\) 个位置是水坑时的方案数,等于所有距离不超过 \(D_2\) 的位置的方案和。

显然,只有所加的方案数里有奇数个奇数相加时,跳到第 \(i\) 个位置的方案数才为奇数。

对应到函数 \(g(i)\) 上,只有所有符合条件的 \(g(j)\) 的和为奇数时,\(g(i)\) 才为 \(1\),更进一步,\(g(i)\) 就是把所有符合条件的 \(g(j)\) 全部异或起来的结果(即 \(g(i)\) 为所有符合条件的 \(g(j)\) 的异或和)

这时我们还发现,\(20 \geq D_1 \geq D_2\),于是就有一个想法:我们可以把连续 \(D_1\) 个位置的 \(g(i)\) 状压,进行状压 DP。

我们设状态数组 \(dp[i][j][k]\),表示进行完了第 \(i\) 位,已经放了 \(j\) 个水坑,之前连续 \(D_1\) 个位置的 \(g(i)\) 状压后的掩码为 \(k\)

\(B_1=2^{D_1}-1\)\(B_2=2^{D_2}-1\),后面用于得出距离不超过 \(D_1\)\(D_2\) 的位置的 \(g(j)\) 的状态,定义函数 \(\text{popcount}(k)\) 为状态掩码 \(k\)\(1\) 的个数,从上面的分析可以看出,\(\text{popcount}(k) \mod 2\)\(\text{popcount}(k) \and 2\),就是 \(g(i)\)

下面给出状态转移方程,方法是计算当前状态对之后状态的贡献:

  • 如果第 \(i\) 为水坑,那么 \(dp[i+1][j+1][ (k<<1)\and B_1 \or (\text{popcount}(k\and B_1)\and1) ]+=dp[i][j][k]\)
  • 如果第 \(i\) 不为水坑,那么 \(dp[i+1][j][ (k<<1)\and B_1 \or (\text{popcount}(k\and B_2)\and1) ]+=dp[i][j][k]\)

其中:

  • \((k<<1)\and B_1 \or (\text{popcount}(k\and B_{0/1})\and1)\)”都是新状态的计算方法。
  • "\(\and B_1\)" 是为了保证新状态的掩码不超过 \(D_1\) 位。
  • \(\text{popcount}(k\and B_{0/1})\and1)\)” 是在计算 \(g(i)\)
  • \((k<<1)\or (\text{popcount}(k\and B_{0/1})\and1)\)“是在把 \(g(i)\) 添加进新的状态掩码中。

相信这个方程还是很显然的。

这时其实就几乎做完了,但由于理论状态数是 \(N\times M\times 2^{D_1}\),时间和空间的复杂度都不可接受,于是还有以下优化:

  • 由于 \(dp[i][j][k]\) 只与 \(dp[i-1][j'][k']\) 有关,可以将关于 \(i\) 的维度写成滚动数组,减小空间复杂度。
  • 对于每个确定的 \(i\)\(j\) 实际用到的 \(k\) 会很少,于是就可以哈希以下 DP 状态,减小时间复杂度。

不过作者不会哈希 DP 状态,所以只得到了 \(90\) 分,以下是这个 \(90\text{pts}\) 的代码:

#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int mod=(1E+9)+7;
const int N=501;
const int M=21;#define ckmax(x,y) ( x=max(x,y) )
#define ckmin(x,y) ( x=min(x,y) )
#define add(x,y) ( x=(x+y)%mod )inline int read()
{int f=1,x=0; char ch=getchar();while(!isdigit(ch)) { if(ch=='-') f=-1; ch=getchar(); }while(isdigit(ch))  { x=x*10+ch-'0';    ch=getchar(); }return f*x;
}int n,m,d1,d2,b1,b2;
int dp[2][M][1<<M];inline int calc(int x)
{int tmp=0;while(x){tmp^=1;x-=(x&(-x));}return tmp;
}signed main()
{freopen("muddyroad.in","r",stdin);freopen("muddyroad.out","w",stdout);n=read(),m=read(),d1=read(),d2=read();if(!n){printf("%d\n",(int)!m);return 0;}b1=(1<<d1)-1,b2=(1<<d2)-1;dp[0][0][1]=1;for(int i=0;i<n;i++){for(int j=0;j<=m;j++)for(int k=0;k<=b1;k++)dp[(i+1)&1][j][k]=0;for(int j=0;j<=m;j++)for(int k=0;k<=b1;k++){if(!dp[i&1][j][k]) continue;int pos=( (k<<1)&b1 )|calc(k);add(dp[(i+1)&1][j][pos],dp[i&1][j][k]);if(j<m){pos=( (k<<1)&b1 )|calc(k&b2);add(dp[(i+1)&1][j+1][pos],dp[i&1][j][k]);}}}int ans=0;for(int k=0;k<=b1;k++)if(k&1) add(ans,dp[n&1][m][k]);printf("%d\n",ans);return 0;
}

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

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

相关文章

洛谷P10112 [GESP202312 八级] 奖品分配

传送门 原题 题目描述 班上有 \(N\) 名同学,学号从 \(0\) 到 \(N-1\)。有 \(M\) 种奖品要分给这些同学,其中,第 \(i\) 种奖品总共有 \(a_i\) 个 (\(i=0,1, \cdots ,M-1\))。 巧合的是,奖品的数量不多不少,每位同…

P10400 『STA - R5』消失的计算机

传送门 原题 题目描述 本题为提交答案题。 后台有一个正整数 \(n\)(你不知道 \(n\) 具体的值)。 你有 \(10^3\) 个变量 \(p_1,p_2,\cdots,p_{10^3}\),初始 \(p_1=n\),\(p_2=p_3=\cdots=p_{10^3}=0\)。 你需要写一个…

2025 地坪研磨机厂家推荐权威推荐排行榜:品牌深度解析及格力 / 宁德时代合作案例速递水磨石/遥控式/座驾式/小型地坪研磨机厂家推荐

伴随城市更新与智能制造升级,环氧地坪、固化混凝土等工程对研磨设备的精度、效率与稳定性提出严苛要求,地坪研磨机市场需求年均复合增长率达 3.5%。但市场中产品质量悬殊,动力不足、精度偏差、售后滞后等问题频发,…

太原网站建设 网站制作wordpress3.9主题

一、仅需实现在线预览&#xff0c;且文件地址公网可访问 &#xff08;一&#xff09;微软office免费预览&#xff08;推荐&#xff09; 支持doc/docx/xls/xlsx/ppt/pptx等多种office文件格式的免费预览 //示例代码//​在https://view.officeapps.live.com/op/view.aspx?src…

中国工信备案查询网站免费自动刷访客量

traceroute 是用来检测发出数据包的主机到目标主机之间所经过的网关数量的工具。traceroute 的原理是试图以最小的TTL发出探测包来跟踪数据包到达目标主机所经过的网关&#xff0c;然后监听一个来自网关ICMP的应答。发送数据包的大小默认为 38个字节。 通过traceroute我们可以知…

2025 年最新推荐铝塑膜源头厂家权威排行榜:聚焦 3000㎡厂房与完整产业链的优质企业盘点复合/防锈防潮/木箱包装/设备包装铝塑膜厂家推荐

在当前工业包装领域,铝塑膜因高阻隔、耐穿刺、密封性强等特性,已成为木箱包装、货运物流、化工储存等行业长途运输与长期保存货物的核心材料。但市场现状却不容乐观,大量厂家存在基材质量差、工艺精度低、定制能力弱…

2025 年真空袋生产厂家最新权威推荐排行榜:TOP 级企业工艺、服务及适配场景全景对比指南木箱/设备/海运防潮/铝塑/电柜真空袋厂家推荐

在工业产品仓储运输环节,包装防护失效引发的问题日益凸显 —— 潮湿导致精密部件锈蚀、穿刺造成化工原料泄漏、密封不佳引发货物变质,不仅带来直接经济损失,更严重影响供应链稳定性。当前市场上真空袋厂家工艺水平悬…

《码界飞升传II:数据星辰异界问道》

【第一卷大数据筑基】 第1章:HDFS剑阵!分布式存储定乾坤 第2章:YARN御兽!资源调度的万兽谱 第3章:MapReduce证道!分而治之的无上心法 第4章:Hive悟道!SQL化繁为简的通天梯 【第二卷NoSQL风云】 第5章:HBase觉…

Win FAQ

Win11 FAQ win11 在白色编辑区域鼠标光标消失不见 win+r调用命令窗口,输入control硬件和声音,点击鼠标鼠标属性->指针->文本选择,选择如图所示beam_r.cur,然后应用

结论(数学)

对于已知函数 \(f(x)\) 和已知直线 \(g(x)=kx+b\),当 \(f(x_0)-g(t_0)\) 取到最小值或最大值时存在 \(h(x)=kx+b_1\) 与 \(f(x)\) 相切于横坐标为 \(t\) 的点。

昆山做网站费用黄岩网站建设

java读取操作系统环境变量import java.util.*;import java.io.*;class SysProb{//返回当前系统变量的函数&#xff0c;结果放在一个Properties里边&#xff0c;这里只针对win2k以上的&#xff0c;其它系统可以自己改进public Properties getEnv() throws Exception{Properties …

网站推荐免费的创意logo一键生成器软件免费

[html] 怎样避免让用户看到长时间的白屏&#xff1f; 我觉得&#xff0c;实际解决办法需要结合用户体验和性能优化这两个指标来说&#xff1a;1、用户体验可以使用骨架屏来减少页面白屏&#xff0c;骨架屏也具有更好的loading效果。2、假如1个页面里面有很多很多网络请求&…

郴州网站设计欧美一级A做爰片成电影网站

随着 React 19 的发布即将到来&#xff0c;它承诺带来一些令人期待的新功能。这个版本不仅仅是又一个更新&#xff0c;而是被寄予厚望&#xff0c;将重新定义我们对待 React 代码的方式。承诺提供增强的速度、效率和更流畅的编码体验&#xff0c;React 19 正准备将 Web 开发提升…

检察网站建设请示wordpress 模板 设计

2.1.1 IoC是什么 Ioc—Inversion of Control&#xff0c;即“控制反转”&#xff0c;不是什么技术&#xff0c;而是一种设计思想。在Java开发中&#xff0c;Ioc意味着将你设计好的对象交给容器控制&#xff0c;而不是传统的在你的对象内部直接控制。如何理解好Ioc呢&#xff1…

loki收集容器日志

Loki介绍Loki 是 Grafana Labs 开源的日志聚合系统,常被称为 “日志界的 Prometheus”。它的设计理念是只索引元数据,不索引完整日志内容,结合 Promtail 和 Grafana,就能实现高效的日志采集、存储与可视化。与传统…

Xcode 火焰图

Xcode - > open developer tool -> time profile -> target -> protile 如果没有符号化,多试几次 判断力是一个人最重要的能力

完整教程:Nginx反向代理与缓存功能

完整教程:Nginx反向代理与缓存功能2025-09-28 16:18 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !imp…

完整教程:dlib库关键点定位和疲劳检测

完整教程:dlib库关键点定位和疲劳检测pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mon…

网站改版对优化的影响福建省住房和城乡建设厅的网站

MySQL大事务可能会导致过多的占用临时文件&#xff0c;导致磁盘空间撑满的问题 本例说明下binlog cache产生的临时文件 案例复现 调小binlog_cache_size&#xff0c;让DML使用临时文件 使用存储过程模拟大事务 创建表 create table t1( id int AUTO_INCREMENT, name varchar…

2025 长沙美食餐厅权威推荐排行榜:老店红记领衔新晋品牌,200 + 湘味与网红菜品深度解析,吃货必藏指南长沙美食湘菜馆 /大排档/网红店餐厅推荐

长沙餐饮市场在 “网红经济” 与 “传统坚守” 的碰撞中持续升温,却也暗藏选择困境:部分老店虽有口碑但创新不足,新兴品牌中不乏跟风炒作、食材劣质的 “短命网红”,更有商家混用预制菜、忽视食品安全,让消费者难…