Luogu P10027 梦境世界 题解 [ 蓝 ] [ 多维 DP ]

news/2025/10/17 8:50:39/文章来源:https://www.cnblogs.com/zhr0102/p/19146943

梦境世界:可爱 DP 题。

一种常见的假做法是在 DP 的过程中记录路径的前驱进行转移,这种做法错误的原因并不在于转移存在环,它其实就是一张 DAG,但是这种状态表示方式并不能推导出前驱的前驱是谁,所以才是假的。

考虑正解。观察路径,发现路径一定由正常走、回溯走、正常走、回溯走的周期进行。因此我们可以在方格取数式的 DP 中给每个转移加一个系数,表示在进行这次移动之前,先进行了 \(x\) 次移动并且用 \(x\)回溯回到了原位。强制钦定回到原位的原因是因为这样才可以清晰地划分路径的状态。

剩下的就是简单的了,我们分两个 DP 做:

  • 先求出 \(g_{i, j, k}\),表示走到 \((i, j)\),在接下来的路线中先走 \(k\) 步,然后再回溯 \(k\) 步,回到 \((i, j)\) 的方案数。类似背包,利用乘法原理转移即可。注意需要倒着枚举 \(i, j\)
  • 再求出 \(f_{i, j, k}\),表示走到 \((i, j)\),已经用了 \(k\) 次回溯的方案数。转移和方格取数差不多,但是需要加上 \(g\) 的系数。

时间复杂度 \(O(n^4)\),如果被卡常可以考虑调换 DP 三个维度的顺序和取模卡常。

#include<bits/stdc++.h>
#define fi first
#define se second
#define eb(x) emplace_back(x)
#define pb(x) push_back(x)
#define lc(x) (tr[x].ls)
#define rc(x) (tr[x].rs)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
using pi = pair<int, int>;
const int N = 105;
int n, m, p, s, f[N][N][N], g[N][N][N], mod;
bitset<N> ban[N];
int main()
{//freopen("sample.in", "r", stdin);//freopen("sample.out", "w", stdout);ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n >> m >> p >> mod >> s;while(s--){int x, y;cin >> x >> y;ban[x][y] = 1;}for(int lv = 0; lv <= p; lv++){for(int i = n; i >= 1; i--){for(int j = m; j >= 1; j--){if(lv == 0){if(ban[i][j] == 0) g[i][j][0] = 1;continue;}if(i + 1 <= n && ban[i + 1][j] == 0){for(int c = 0; c < lv; c++){g[i][j][lv] += (1ll * g[i][j][lv - c - 1] * g[i + 1][j][c]) % mod;if(g[i][j][lv] >= mod) g[i][j][lv] -= mod;}}                    if(j + 1 <= m && ban[i][j + 1] == 0){for(int c = 0; c < lv; c++){g[i][j][lv] += (1ll * g[i][j][lv - c - 1] * g[i][j + 1][c]) % mod;if(g[i][j][lv] >= mod) g[i][j][lv] -= mod;}}}}}f[1][1][0] = 1;for(int lv = 0; lv <= p; lv++){for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){if(ban[i][j]) continue;if(i + 1 <= n && ban[i + 1][j] == 0){for(int c = 0; c + lv <= p; c++){f[i + 1][j][c + lv] += (1ll * f[i][j][lv] * g[i][j][c]) % mod;if(f[i + 1][j][c + lv] >= mod) f[i + 1][j][c + lv] -= mod;}}if(j + 1 <= m && ban[i][j + 1] == 0){for(int c = 0; c + lv <= p; c++){f[i][j + 1][c + lv] += (1ll * f[i][j][lv] * g[i][j][c]) % mod;if(f[i][j + 1][c + lv] >= mod) f[i][j + 1][c + lv] -= mod;}}}}}int ans = 0;for(int i = 0; i <= p; i++) ans = (ans + f[n][m][i]) % mod;cout << ans;return 0;
}

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

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

相关文章

winserver文件备份到minio

winserver开启 WSMan PS C:\Users\Administrator> Enable-PSRemoting -Force PS C:\Users\Administrator> Set-Item WSMan:\localhost\Client\TrustedHosts -Value "192.168.,17.1.0." -Force PS C:\U…

完整教程:「2025秋招季」AI简历筛选如何破解海选难题?

完整教程:「2025秋招季」AI简历筛选如何破解海选难题?2025-10-17 08:39 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; …

F1分数(F1-score)

* { margin: 0; padding: 0; box-sizing: border-box } body { font-family: "Microsoft YaHei", "Arial", sans-serif; background: linear-gradient(135deg, rgba(102, 126, 234, 1) 0, rgba(11…

教你把未分配的磁盘合并到C盘或者D盘?如何把未分配的硬盘空间分配到另一个磁盘?Windows 11,如何将未分配的磁盘分配给 C 盘?怎么把未分配的磁盘合并到d盘

基本上几步就能学会,先来看看,大概的思路就是:如果多余的盘存在,则需要删除这个磁盘券;扩展需要合并的盘;把需要合并的盘合并进来就完成了。我有几个盘,但其中一个盘我想合并到D盘中,合并到C盘也是一样的道理,…

ComfyUI InstantID 文生图,图生图完整运行指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

项目ai拷打

模块一:高并发点赞 & 幂等性问题:高并发点赞,方案怎么设计?核心答案: 缓存层:使用Redis的SET,Key为article:likes:{文章ID},Value为用户ID。 优点:SADD天然幂等防重;SCARD O(1)复杂度快速计数;SREM快速…

混合(ZR 二十联测 A + MX 炼石 ABC)

100 + 100 + 25 + 20 = 245, Rank 2/6.第一次过 200 是因为放了 2 个 A .jpg混合(ZR 二十联测 A + MX 炼石 ABC) A:ZR 2025 NOIP 二十连测 Day 4 A B:MX 练石 2025 NOIP #11 A C:MX 练石 2025 NOIP #11 B D:MX 练…

Qt项目作品在苹果macos上编译运行效果/视频监控系统/物联网平台等

一、前言说明 在这十几年时间里,用Qt写过几十个项目,一百多个组件,几百个控件,最开始的时候并没有考虑跨平台的问题,后面有用户陆陆续续有其他平台的要求,所以后期写的代码,从一开始设计阶段就会考虑跨平台问题…

电脑硬盘中的文件怎么搜索?电脑文件搜索太慢怎么办?

下载地址获取 https://pan.quark.cn/s/aa60321f9619 所以目录使用教程 双击直接打开 特点 搜索快,直接搜索就能用

实用指南:VMware挂载Kail Linux

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年靠谱的风机/离心风机/轴流风机生产企业排行榜-江苏中南鼓风机有限公司

江苏中南鼓风机有限公司是一家专业从事各类国标、特种及专用风机研发、生产和性能测试的制造企业。产品涵盖离心风机、轴流风机、锅炉风机、窑炉风机、高温风机以及防爆、密封、除尘等多功能风机,材质覆盖碳钢、不锈钢…

OpenCV基础操作与图像处理 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

实用指南:动态规划之买卖股票的最佳时机III和IV

实用指南:动态规划之买卖股票的最佳时机III和IV2025-10-17 08:11 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display…

2025年行业内游乐设施/过山车游乐设施权威榜单厂家-河北天鸿游乐设备

河北天鸿游乐设备有限责任公司位于河北省衡水市,是一家专注于大型主题游乐设施研发、制造、安装及销售的高新技术机构,尤其在旋转塔和过山车领域具有行业领先地位,拥有大型游乐设施A级生产许可证。 推荐指数:9.5/1…

机器学习技术助力美国西海岸地震预警系统升级

加州理工学院研究团队利用机器学习技术和云计算平台,构建能够实时处理地震数据的新型预警系统。该系统通过深度学习算法将地震事件检测能力提升3-5倍,并能更精准定位地下断层位置。机器学习技术助力美国西海岸地震预…

2025年口碑好的挤浆机/单螺旋挤浆机TOP品牌推荐厂家-滕州市建兴机械有限公司

滕州市建兴机械有限公司自2003年起专注于浆渣物料连续脱水、压榨及固液分离设备的研发与制造,积累二十余年技术经验,在行业内具备深厚的技术沉淀和生产能力。产品广泛应用于造纸制浆、生物质能源、食品加工、植物提取…

2025年市场课桌椅/钢塑课桌椅最新TOP排名厂家-江西华聚智能家具集团有限公司

江西华聚智能家具集团概况 江西华聚智能家具集团有限公司成立于2022年,前身为江西省南城县发华实业,位于江西省抚州市南城县株良镇古竹工业园区,占地超过8万平方米。集团专注于高端校具的研发、制造与服务,产品涵盖…

2025年口碑好的垃圾袋/医疗垃圾袋排名推荐生产厂家-厦门市万塑环保材料有限公司

本网10月16日讯 厦门市万塑环保材料有限公司成立于2000年,位于厦门市集美北部工业区,是福建省首批专注生物降解塑料袋生产的企业之一。主要产品包括竹纤维降解垃圾袋、宠物垃圾袋、双色提醒拾便袋、婴儿尿布桶垃圾袋…

实用指南:docker镜像和容器

实用指南:docker镜像和容器pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco",…

深入理解 PHP-FPM 的最佳配置

深入理解 PHP-FPM 的最佳配置 对大多数开发者来说,PHP-FPM 的配置并不是日常工作中需要深入研究的东西。这没什么问题,毕竟不是每个人都想或需要在服务器调优上花时间。 况且,现在有很多托管服务(宝塔, 1panel等)…