題目 trs喜歡滑雪。他來到了一個滑雪場,這個滑雪場是一個矩形,為了簡便,我們用r行c列的矩陣來表示每塊地形。為了得到更快的速度,滑行的路線必須向下傾斜。 例如樣例中的那個矩形,可以從某個點滑向上下左右四個相鄰的點之一。例如24-17-16-1,其實25-24-23…3-2-1更長,事實上這是最長的一條。
輸入格式:
第1行: 兩個數字r,c(1< =r,c< =100),表示矩陣的行列。 第2..r+1行:每行c個數,表示這個矩陣。
輸出格式:
僅一行: 輸出1個整數,表示可以滑行的最大長度。
樣例輸入
5 5 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 樣例輸出
25
分析題目: 題目是從某個點出發,那么假設先從h[0][0]開始 它的初始值距離為1,而后向選擇4個方向走 有f[i][j]表示每個起始點的最大滑行距離,然后用dfs記憶搜索
狀態轉移方程
f[x][y] = max(f[x][y], DFS(x, y - 1) + 1); f[x][y] = max(f[x][y], DFS(x, y - 1) + 1); f[x][y] = max(f[x][y], DFS(x + 1, y) + 1); f[x][y] = max(f[x][y], DFS(x, y + 1) + 1);
#include "bits/stdc++.h"using namespace std ;const int maxN = 110 ;int h[maxN][maxN] , f[maxN][maxN] ;int n, m, ans = 1;int DFS(int x, int y){ if( f[x][y] )//判斷是否被搜索過 return f[x][y]; f[x][y] = 1; if(x > 1 && h[x][y] < h[x - 1][y]) f[x][y] = max(f[x][y], DFS(x - 1, y) + 1); if(y > 1 && h[x][y] < h[x][y - 1]) f[x][y] = max(f[x][y], DFS(x, y - 1) + 1); if(x < n && h[x][y] < h[x + 1][y]) f[x][y] = max(f[x][y], DFS(x + 1, y) + 1); if(y < m && h[x][y] < h[x][y + 1]) f[x][y] = max(f[x][y], DFS(x, y + 1) + 1); ans = max(ans, f[x][y]); return f[x][y];}int main(){ scanf("%d%d", &n, &m); for ( int i = 1 ; i <= n ; i++ ) for ( int j = 1 ; j <= m ; j++ ) scanf( "%d" , &h[i][j] ) ; for(int i = 1 ; i <= n ; i++ ) for(int j = 1 ; j <= m ; j++ ) f[i][j] = DFS( i , j ) ;