news 2026/2/14 14:29:49

UVa 12295 Optimal Symmetric Paths

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UVa 12295 Optimal Symmetric Paths

题目描述

你有一个nnnnnn列的网格,每个单元格包含一个非零数字(111999)。你需要从左上角(0,0)(0,0)(0,0)走到右下角(n−1,n−1)(n-1,n-1)(n1,n1),每一步可以向上、下、左、右移动到相邻单元格(不能走对角线),并且不能重复访问同一个单元格。此外,路径必须关于从网格左下角到右上角的副对角线对称。下图展示了一个6×66 \times 66×6网格中的一条对称路径。

你的任务是,在所有合法对称路径中,找出数字和最小的路径有多少条?答案对1,000,000,0091,000,000,0091,000,000,009取模。

输入格式
最多252525个测试用例。每个测试用例以一个整数nnn2≤n≤1002 \le n \le 1002n100)开始。接下来nnn行,每行包含nnn个非零数字(111-999)。输入以n=0n=0n=0结束。

输出格式
对每个测试用例,输出最优对称路径的数量,模1,000,000,0091,000,000,0091,000,000,009


题目分析

对称性的理解

题目要求路径关于副对角线对称。副对角线是连接左下角(n−1,0)(n-1,0)(n1,0)和右上角(0,n−1)(0,n-1)(0,n1)的直线,其上的点满足i+j=n−1i + j = n-1i+j=n1

对称性意味着:如果路径经过点(i,j)(i,j)(i,j),则它也必须经过其对称点(n−1−j, n−1−i)(n-1-j,\; n-1-i)(n1j,n1i)。特别地:

  • 起点(0,0)(0,0)(0,0)的对称点是终点(n−1,n−1)(n-1,n-1)(n1,n1)
  • 终点(n−1,n−1)(n-1,n-1)(n1,n1)的对称点是起点(0,0)(0,0)(0,0)
  • 如果(i,j)(i,j)(i,j)在副对角线上(i+j=n−1i+j=n-1i+j=n1),则对称点就是它本身。

因此,整条路径关于副对角线对称,我们可以只考虑副对角线及其左上方(即i+j≤n−1i+j \le n-1i+jn1)的区域,另一半由对称性自动确定。

路径权重的计算

由于对称性,当路径经过(i,j)(i,j)(i,j)和它的对称点时,这两个单元格的数字都要计入总权重。但为了简化计算,我们可以预先定义一个对称权重矩阵cost[i][j]cost[i][j]cost[i][j],表示如果路径经过(i,j)(i,j)(i,j)(从而必然经过对称点),应贡献的总数字和:

  • 如果i+j=n−1i+j = n-1i+j=n1(在副对角线上),则cost[i][j]=grid[i][j]cost[i][j] = grid[i][j]cost[i][j]=grid[i][j]
  • 否则,cost[i][j]=grid[i][j]+grid[n−1−j][n−1−i]cost[i][j] = grid[i][j] + grid[n-1-j][n-1-i]cost[i][j]=grid[i][j]+grid[n1j][n1i]

注意:我们只对i+j≤n−1i+j \le n-1i+jn1的区域定义costcostcost,因为i+j>n−1i+j > n-1i+j>n1的区域是对称的,不需要重复计算。

问题转化

原问题转化为:在只允许访问i+j≤n−1i+j \le n-1i+jn1的区域、且每一步只能向相邻单元格移动(不重复访问)的条件下,从(0,0)(0,0)(0,0)出发,到达副对角线上的任意一点(k,n−1−k)(k, n-1-k)(k,n1k)的最小总权重路径的数量。因为从(0,0)(0,0)(0,0)(n−1,n−1)(n-1,n-1)(n1,n1)的对称路径必然经过副对角线上的某个点,并且由于对称性,路径在副对角线上的点“反射”后形成完整路径。

因此,我们只需要:

  1. 求出从(0,0)(0,0)(0,0)到每个副对角线点(k,n−1−k)(k, n-1-k)(k,n1k)的最小总权重。
  2. 找出这些最小权重中的最小值minValueminValueminValue
  3. 统计所有从(0,0)(0,0)(0,0)到副对角线点且总权重等于minValueminValueminValue的路径数量。

算法设计

步骤1:最短路径搜索

这是一个带有非负权重的网格图最短路径问题,可以使用Dijkstra\texttt{Dijkstra}Dijkstra算法
我们只考虑区域i+j≤n−1i+j \le n-1i+jn1,从(0,0)(0,0)(0,0)开始,更新到每个点的最短距离dist[i][j]dist[i][j]dist[i][j],同时记录每个节点的前驱节点列表parentparentparent,用于后续统计路径数量。

步骤2:构建隐式图并统计路径数

得到所有点的最短距离后,我们构建一个隐式图:

  • 每个网格点(i,j)(i,j)(i,j)对应一个节点,编号为i×n+ji \times n + ji×n+j
  • 对于每个节点vvv,遍历其前驱节点列表parent[v]parent[v]parent[v],在图中添加一条有向边u→vu \to vuvuuuvvv的前驱)。

这样,从起点(0,0)(0,0)(0,0)到任意节点vvv的所有最短路径就对应隐式图中从000vvv的所有路径。

步骤3:记忆化搜索(DFS\texttt{DFS}DFS)计数

我们设dp[u]dp[u]dp[u]表示从节点uuu出发,到达任意一个最优副对角线节点(即distdistdist等于bestbestbest的副对角线节点)的最短路径数量。

初始化:

  • 对于副对角线上的节点v=(k,n−1−k)v = (k, n-1-k)v=(k,n1k),如果dist[v]=bestdist[v] = bestdist[v]=best,则dp[v]=1dp[v] = 1dp[v]=1(表示到达自身有一条路径);否则dp[v]=0dp[v] = 0dp[v]=0
  • 其他节点dp[u]=−1dp[u] = -1dp[u]=1(未计算)。

然后从起点000(对应(0,0)(0,0)(0,0))开始进行记忆化DFS\texttt{DFS}DFS
dp[u]=∑v∈g[u]dp[v]dp[u] = \sum_{v \in g[u]} dp[v]dp[u]=vg[u]dp[v],其中g[u]g[u]g[u]uuu的后继节点列表(即隐式图中从uuu出发能到达的下一个节点)。

最终dp[0]dp[0]dp[0]即为所求的答案。


复杂度分析

  • Dijkstra\texttt{Dijkstra}Dijkstra算法:网格有O(n2)O(n^2)O(n2)个节点,每个节点最多444条边。使用优先队列,时间复杂度O(n2log⁡n)O(n^2 \log n)O(n2logn)
  • 构建隐式图:遍历所有边,O(n2)O(n^2)O(n2)
  • 记忆化DFS\texttt{DFS}DFS:每个节点访问一次,O(n2)O(n^2)O(n2)
    总时间复杂度O(n2log⁡n)O(n^2 \log n)O(n2logn),在n≤100n \le 100n100时完全可行。

空间复杂度O(n2)O(n^2)O(n2)


代码实现

// Optimal Symmetric Paths// UVa ID: 12295// Verdict: Accepted// Submission Date: 2025-12-25// UVa Run Time: 0.010s//// 版权所有(C)2025,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;constintMAXN=110;constintMOD=1000000009,INF=0x3f3f3f3f;constintdx[4]={1,-1,0,0},dy[4]={0,0,1,-1};intdist[MAXN][MAXN],grid[MAXN][MAXN],cost[MAXN][MAXN],dp[MAXN*MAXN];vector<int>g[MAXN*MAXN];// 隐式图的邻接表vector<int>parent[MAXN*MAXN];// 每个节点的最短路径前驱节点// 记忆化搜索:从节点 u 出发到达副对角线的最优路径数量intdfs(intu){intanswer=0;for(autov:g[u]){if(~dp[v])answer=(answer+dp[v])%MOD;elseanswer=(answer+dfs(v))%MOD;}returndp[u]=answer;}intmain(){cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);intn;while(cin>>n&&n){// 读入网格for(inti=0;i<n;i++)for(intj=0;j<n;j++)cin>>grid[i][j];// 计算对称权重矩阵,仅考虑副对角线及其左上方区域for(inti=0;i<n;i++)for(intj=0;j<n;j++){if(i+j>=n)continue;// 忽略右下方区域intsi=n-1-j,sj=n-1-i;// 对称点坐标if(i+j==n-1)cost[i][j]=grid[i][j];// 副对角线上的点elsecost[i][j]=grid[i][j]+grid[si][sj];// 非对角线点,加上对称点权重}// Dijkstra 求最短路径memset(dist,0x3f,sizeofdist);for(inti=0;i<n*n;i++)parent[i].clear();dist[0][0]=cost[0][0];usingstate=tuple<int,int,int>;priority_queue<state,vector<state>,greater<state>>pq;pq.push({dist[0][0],0,0});while(!pq.empty()){auto[d,x,y]=pq.top();pq.pop();if(d>dist[x][y])continue;for(intdir=0;dir<4;dir++){intnx=x+dx[dir],ny=y+dy[dir];// 确保在网格内且位于副对角线左上方if(nx<0||nx>=n||ny<0||ny>=n||nx+ny>=n)continue;intnd=d+cost[nx][ny];if(nd<dist[nx][ny]){dist[nx][ny]=nd;pq.push({nd,nx,ny});parent[nx*n+ny].clear();parent[nx*n+ny].push_back(x*n+y);}elseif(nd==dist[nx][ny]){parent[nx*n+ny].push_back(x*n+y);}}}// 构建隐式图:从每个节点的前驱节点连边for(inti=0;i<n*n;i++)g[i].clear();for(inti=0;i<n;i++)for(intj=0;j<n;j++){if(i+j>=n)continue;for(autop:parent[i*n+j])g[p].push_back(i*n+j);}// 初始化记忆数组memset(dp,-1,sizeofdp);// 找出到达副对角线的最小总权重intbest=INF;for(inti=0;i<n;i++)best=min(best,dist[i][n-1-i]);// 设置副对角线上节点的 dp 值for(inti=0;i<n;i++)dp[i*n+n-1-i]=dist[i][n-1-i]==best;// 从起点 (0,0) 开始 DFS 统计最优路径数量cout<<dfs(0)<<"\n";}return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/8 20:33:12

27、TCP/IP网络中的流量与拥塞控制技术解析

TCP/IP网络中的流量与拥塞控制技术解析 在TCP/IP网络中,流量控制和拥塞控制是确保网络高效、稳定运行的关键技术。下面将详细介绍几种常见的拥塞控制机制,包括TCP Vegas、带显式拥塞通知(ECN)的TCP,以及EASY速率基流量控制方案。 1. TCP Vegas拥塞控制机制 TCP Vegas是…

作者头像 李华
网站建设 2026/2/14 10:51:10

28、高速网络中的QoS路由:原理与实现

高速网络中的QoS路由:原理与实现 1. QoS路由概述 在传统数据网络中,路由主要关注的是连通性。路由协议通常使用单一指标(如跳数或延迟)来描述网络,并采用最短路径算法进行路径计算,而往往忽略了不同数据包或流可能具有的服务质量(QoS)要求。这就导致路由决策在不考虑…

作者头像 李华
网站建设 2026/2/5 13:03:12

【智谱Open-AutoGLM论文精读】:3步搞懂大模型自动任务生成机制

第一章&#xff1a;智谱Open-AutoGLM论文核心思想智谱AI推出的Open-AutoGLM项目&#xff0c;旨在构建一个面向自然语言处理任务的自动化大模型调优框架。该框架融合了提示工程、模型微调与任务自适应机制&#xff0c;通过统一接口实现对多种下游任务的零样本或少样本高效迁移。…

作者头像 李华
网站建设 2026/2/12 11:00:48

AutoGLM如何颠覆AI编程?智谱最新论文技术细节全曝光,开发者必看

第一章&#xff1a;AutoGLM的诞生背景与核心理念随着大语言模型在自然语言处理领域的广泛应用&#xff0c;如何高效地将模型能力应用于实际业务场景成为关键挑战。传统模式下&#xff0c;开发者需手动编写提示词、设计流程逻辑并反复调试&#xff0c;成本高且难以规模化。在此背…

作者头像 李华
网站建设 2026/2/6 21:42:07

【Open-AutoGLM镜像仓库全解析】:国内可用源推荐与加速访问策略

第一章&#xff1a;Open-AutoGLM有没有国内的镜像仓库目前&#xff0c;Open-AutoGLM 作为一个前沿的开源大模型项目&#xff0c;在 GitHub 等国际平台上有官方代码仓库。然而&#xff0c;由于网络访问限制&#xff0c;国内开发者在克隆或更新代码时可能遇到速度缓慢甚至连接失败…

作者头像 李华
网站建设 2026/2/13 11:28:04

Open-AutoGLM部署难题全解析:3个关键步骤避免90%的常见错误

第一章&#xff1a;Open-AutoGLM手机部署的核心挑战将大型语言模型如Open-AutoGLM部署至移动设备&#xff0c;面临多重技术瓶颈。尽管模型在云端表现出色&#xff0c;但受限于手机硬件资源与运行环境&#xff0c;实际落地过程需克服算力、内存和能耗等关键问题。模型体积与内存…

作者头像 李华