解题思路:联系回溯法,使用阶段的思路,每一列相当于层数,可转移的三个状态为三棵子树,因此用一个二维数组dp[i][j]表示状态,其中j代表阶段(层数),在这里就是第几列,i表示行数。注意矩阵为环形,要做相应的处理,深入理解阶段的含义以及动态规划和回溯的关系。细节参见代码。
题目大意:从矩阵第一列的任一位置出发往右,可以直接往右,往右上或往右下,最终到达最后一列,整个矩阵为环形,第一行的上一行为最后一行,最后一行的下一行为第一行,要求经过的整数和最小,求最优路线。多解时输出字典序最小的。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define inf 1<<30
int maze[11][101];
int dp[11][101];
int n,m;
void print(int x,int y) //打印字典序最小的路径
{
cout<<x<<" ";
if(y==m) {
cout<<endl;
return;
}
int row[3]={x-1,x,x+1};
if(x==1) row[0]=n; //注意这里的环形处理
if(x==n) row[2]=1;
sort