尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

Luogu P10027 梦境世界 题解 [ 蓝 ] [ 多维 DP ]
📅 发布时间:2026/6/18 18:56:04

梦境世界:可爱 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;
}

相关新闻

  • winserver文件备份到minio
  • 教你把未分配的磁盘合并到C盘或者D盘?如何把未分配的硬盘空间分配到另一个磁盘?Windows 11,如何将未分配的磁盘分配给 C 盘?怎么把未分配的磁盘合并到d盘
  • 实用指南:VMware挂载Kail Linux

最新新闻

  • 基于DPDK与OVS-DPDK构建高性能虚拟化网络数据平面实践
  • 西安定制私家团旅行社排行:5家正规机构深度对比 - 起跑123
  • 2026 郑州管城回族区回收渠道测评|上门邮寄品牌排行榜推荐 - 奢侈品回收
  • 2026年《无畏契约》游戏鼠标推荐:新手入门性价比高值得买 - GrowthUME
  • 【2026年6月】中型货架厂家与仓储货架企业推荐指南 - 多才菠萝
  • 2026大连黄金回收市场大整治!正规甄别标准出炉,避坑不踩雷 - 奢侈品回收评测

日新闻

  • 2026年不锈钢卷板厂家推荐排行榜:冷轧热轧/304/201不锈钢卷板,高颜值耐腐蚀源头厂家实力精选 - 企业推荐官【官方】
  • FLUX.1-dev FP8模型实战指南:24GB以下显卡高效部署方案
  • 2026佛山长途搬家价目表:跨省跨市搬家费用完整计算指南 - 从来都是英雄出少年

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号