メモリの検索について:https://blog.csdn.net/hjf1201/article/details/78680814
トピックへのリンク:https://www.luogu.org/problem/P1434
アイデア:結果はポイントの上に発見されているが、この点についての検索に必要な次の時間を節約する、格納された結果の直接の使用が戻ります。注意シークは最長パスです
#include <cstdioを> する#include <iostreamの> する#include <アルゴリズム> の#include <cmath> の#include <キュー> の#include <ベクトル> の#include <CStringの> する#include <地図> の#define MEM(A)のmemset(、 0、はsizeof(a))が 使用 名前空間STDを、 typedefの長い 長いLLL。 const int型 MAXN = 200005 ; constの LLL INF = 0x3f3f3f3f3f 。 INT DIR [ 8 ] [ 2 ] = { 2、1、1、2、 - 2、1、 - 1、2、2、 - 1、1、 - 2、 - 2、 - 1、 - 1、 - 2 }。 INT DIR2 [ 4 ] [ 2 ] = { 0、1、0、 - 1、1、0、 - 1、0 }。 ブールフラグ。 INT [ 105 ] [ 105 ]、VIS [105 ] [ 105 ]、ANS、R、C。 INT DFS(int型のx、int型のY){ // COUT << X << " "<< Y <<"" << CNT << ENDL。 // VIS [X] [Y] = 1。 もし(!VIS [X] [Y] = 0)を返すVISが[X] [Y]。 int型の T、TT = 1 、I; 用(i = 0 ; iは< 4 ; iは++ ) { int型の FX = X + DIR2 [I] [ 0 ]、FY = Y + DIR2 [I] [ 1 ]。 もし(FX> 0 && FX <0 && FY <C + 1 && [FX] [FY] < [X] [Y]) { T = DFS(FX、FY)+ 1 。 TT = MAX(T、TT)。 } } VIS [X] [Y] = MAX(TT、VIS [X] [Y])。 戻りVIS [X] [Y]。 } int型のmain() { CIN >> R >> C。 用(int型 iは= 1 ; I <= R iが++ ) { ため(INT J = 1 ; J <= C; J ++ ) CIN >>[I] [J]。 } のために(int型 I = 1 ; I <= R iは++ ) { ための(int型 J = 1 ; J <= C; J ++ ) { // COUT <<「============= =」<<てendl; // coutの<< "I = "<< I <<" J =" << J <<てendl; VIS [I] [J] = DFS(i、j)は;; ANS = MAX(ANS、VIS [I] [J]); // coutの<< "==============" <<てendl; } } COUT << ANS << ENDL。 リターン 0 ; }