9.3 多阶段决策问题
这一章先看题。
9.3.1 多段图的最短路
9-4 单向 TSP (UVA 116)
给一个m行n列(m<=10,n<=100,这里的数据范围就是提醒大家这是一个宽度可能要远大于长度的矩阵)的整数矩阵,从第一列任何一个位置出发每次向右,右上或右下三个方向选择一个方向走一格,最终到达最后一列。要求经过的整数之和最小。整个矩阵是环形的,即第一行的上一行是最后一行,最后一行的下一行是第一行。输出路径路径每列的行号,多解时输出最小的。
分析:状态的设计就比较简单了,d(i,j)表示从格子(i,j)出发到最后一列的最小开销。于是有状态转移方程:d[i][j]=max{d[i-1][j+1],d[i][j+1],d[i+1][j+1]}+a[i][j]。边界条件的话比较简单:d[i][n]=0,d[i][n-1]=a[i][j],逆推即可。
代码如下:
int ans=INF,first=0;//ans表示最短路径,first表示在第一列的第first行出发可以得到最短路径
for (int j=n-1;j>=0;j--) for (int i=0;i<m;i++){
if (j==n-1) d[i][j]=a[i][j];//边界条件
else{
int rows[3]={
i-1,i,i+1};//表示右上,右,右下三个方向
//环形矩阵,第0行上面一行是第m-1行,第m-1行下面是第0行
if (i==0) rows[0]=m-1; if (i==m-1) rows[2]=0;
sort(rows,rows+3); d[i][j]=INF;//这里的排序是为了方便得到字典序最小的解
for (int k