記憶化搜尋(DFS+動態規劃)--滑雪
阿新 • • 發佈:2019-02-03
#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;
}
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;
}