1. 程式人生 > >記憶化搜尋(DFS+動態規劃)--滑雪

記憶化搜尋(DFS+動態規劃)--滑雪

#include
using namespace std;
const int maxn = 105;
int map[maxn][maxn];
int idx[maxn][maxn];                     //using for recording the biggest length of
                //all routes from a certain node
int dir[4][2] = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 } };  //遍歷四向方格方法(帶*號行)
int R, C;
int dfs(int x, int y)
{
 if (idx[x][y])                           //避免重複計算,剪枝
  return idx[x][y];
 int dx, dy;                     
 for (int i = 0; i < 4; i++)                 //*
 {
  dx = x + dir[i][0];       //*
  dy = y + dir[i][1];       //*
  if (dx >= 0 && dx= 0 && dy
  if (map[dx][dy] < map[x][y])////*
  {
   int temp = dfs(dx, dy);      //暫時用temp代替dfs()返回值
   if (idx[x][y] <= temp)  //若>,為得到連線多條後續路徑的某結點其中最長一條長度,跳過
    idx[x][y] = temp + 1;  //此結點比下一結點長一
  }
 }
 return idx[x][y];
}
int main()
{
 while (cin >> R >> C)
 {
  memset(map, 0, sizeof(map));
  memset(idx, 0, sizeof(idx));
  for (int i = 0; i < R; i++)
  for (int j = 0; j < C; j++)
   cin >> map[i][j];//
  int max = -1;    //max計算多組資料最值法
  for (int i = 0; i < R; i++)
  for (int j = 0; j < C; j++)     //遍歷所有結點作為起點情況,idx為全域性,局面儲存,
         //在圖內遇到其它結點可立刻獲得
         //此結點所連最大路徑長度,大剪枝
  {
   int temp = dfs(i, j);
   if (max < temp)
   {
    max = temp;
   }
  }
  cout << max + 1 << endl;    //別忘長度還需要+1
 }
 return 0;
}