UVA - 116 Unidirectional TSP(dp+多段图的最短路)

本文介绍了一种解决环形矩阵中寻找从任意起始列到最后一列的最短路径问题的算法,并通过逆向动态规划实现了路径的追踪与输出。
题意:
给一个n行m列的整数矩阵,从第一列任何一个位置出发每次往右、右上或右下走一格,最终到达最后一列。要求经过的整数之和最小。整个矩阵是环形的,即第一行的上一行是最后一行,最后一行的下一行是第一行。
输出路径上每行的行号。多解时输出字典序最小的。
解析:

从后往前逆推,dp[i][j]记录,到(i,j)当前整数和最小,再开一个next数组用于保存路径。

#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 105;
const int INF = 0x3f3f3f3f;
int grid[N][N];
int next[N][N], dp[N][N];
int m,n;
int main() {
	while( scanf("%d%d",&n,&m) != EOF) {
		for(int i = 0; i < n; i++) {
			for(int j = 0; j < m; j++) {
				scanf("%d",&grid[i][j]);
			}
		}
		memset(dp,0,sizeof(dp));
		int ans = INF , first = 0;
	
		for(int j = m-1; j >= 0; j--) { //逆推
			for(int i = 0; i < n; i++) {
				if(j == m-1) {
					dp[i][j] = grid[i][j];
				}else {
					int rows[3] = {i-1, i, i+1};
					if(i == 0) { //边界
						rows[0] = n-1;
					}
					if(i == n-1) {
						rows[2] = 0;
					}
					sort(rows,rows+3);
					dp[i][j] = INF;
					for(int k = 0; k < 3; k++) { //求当前所花费的最少步数
						int v = dp[rows[k]][j+1] + grid[i][j];
						if(v < dp[i][j]) {
							dp[i][j] = v;
							next[i][j] = rows[k];
						}
					}
				}
				if(j == 0 && dp[i][j] < ans) {
					ans = dp[i][j];
					first = i;
				}
			}
		}
		printf("%d",first+1);
		int i = next[first][0] , j = 1;
		while( j < m) {
			printf(" %d",i+1);
			i = next[i][j];
			j++;
		}
		printf("\n%d\n",ans);
	}
	return 0;
}


### MarchC, MarchX 及其他 March 算法的定义与区别 #### 1. **MarchC** MarchC 是一种经典的存储器测试算法,主要用于检测单元间耦合故障(Cell-to-Cell Coupling Faults)。它通过交替读取和写入互补的数据模式来检查相邻存储单元之间的干扰。该算法的特点在于其能够有效发现因电容耦合导致的错误。 ```plaintext Algorithm MarchC: for i from 0 to n-1 do Write(0, addr[i]) end for for i from 0 to n-1 do Read(addr[i]) == 0 end for for i from n-1 downto 0 do Write(1, addr[i]) end for for i from n-1 downto 0 do Read(addr[i]) == 1 end for ``` --- #### 2. **MarchX** MarchX 是另一种增强版的存储器测试算法,专门设计用于检测更复杂的故障模型,例如多比特翻转或多行间的交互影响。相比 MarchC,它的覆盖范围更大但执行时间也相对较长。 ```plaintext Algorithm MarchX: Write(0, all_addresses) for each address A in sequence do Complement(A) VerifyComplement(A) end for VerifyAllAddresses() ``` --- #### 3. **MATS++** MATS++ 是 Memory Array Test Suite Plus Plus 的缩写,是一种综合性的存储器测试方案,结合了多种 March 算法的优点。它可以灵活配置以适应不同类型的存储设备,并能有效地检测出大多数已知的存储器故障类型。 --- #### 4. **MarchA / MarchB** 这两种算法分别代表了两种不同的测试策略: - **MarchA** 主要针对单比特翻转进行优化。 - **MarchB** 则更加注重于多比特翻转及复杂耦合效应的探测。 两者的主要差异体现在具体的地址遍历顺序以及数据模式的选择上。 --- #### 5. **MarchLA / MarchLR / MarchSR / MarchU / MarchUD / MarchG** 这些变种进一步细化了 March 系列算法的应用领域: - **MarchLA**: Linear Addressing variant focusing on linear traversal. - **MarchLR**: Left-to-right addressing pattern with specific data toggling rules. - **MarchSR**: Sequential Reversed order testing approach. - **MarchU & MarchUD**: Unidirectional and bidirectional versions emphasizing directional sensitivity analysis. - **MarchG**: Generalized form allowing customizable parameters based on target memory architecture. 每种版本都有特定的目标应用场景和技术细节调整,从而满足多样化的工业需求。 --- #### 总结对比表 | Algorithm | Primary Focus | Complexity Level | |-----------|----------------------------------|-----------------| | MarchC | Cell coupling faults | Medium | | MarchX | Multi-bit upsets | High | | MATS++ | Comprehensive fault detection | Very high | | MarchA/B | Single/Multi-bit upset handling | Low-Medium | | Others... | Specialized use cases | Varies widely | 以上信息整合自公开文献资料及行业实践总结而成。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值