Train of Thought: this question can be found in the Board DP or search, or brute force, because the board is relatively small.
The bidirectional DFS is used here.
# Pragma comment (linker, "/Stack: 1024000000,1024000000 ") # include <iostream> # include <cstdio> # include <cstring> # include <algorithm> # include <map> # include <queue> # include <set> # include <cmath> # include <bitset> # define MEM (, b) memset (a, B, sizeof (A) # define lson I <1, L, mid # define rson I <1 | 1, Mid + 1, R # define llson j <1, L, mid # define rrson j <1 | 1, Mid + 1, R # define INF 0x7ffffffftypedef long ll; typedef unsigned long Long ull; using namespace STD; int n, a [10] [11], Max; void dfs2 (int I, Int J, int sum) {if (I = 1 & J = 1) max = max (max, sum); else {if (I> 1 & A [I-1] [J]! =-1) dfs2 (I-1, J, sum + A [I] [J]); If (j> 1 & A [I] [J-1]! =-1) dfs2 (I, J-1, sum + A [I] [J]);} void dfs1 (int I, Int J, int sum) {if (I = N & J = n) A [1] [1] = 0, dfs2 (N, N, sum ); else {int CNT = A [I] [J]; A [I] [J] =-1; if (I <n) dfs1 (I + 1, J, sum + CNT); If (j <n) dfs1 (I, j + 1, sum + CNT); A [I] [J] = CNT ;}} int main () {int U, V, W; scanf ("% d", & N); While (~ Scanf ("% d", & U, & V, & W )) {If (u = 0 & V = 0 & W = 0) break; A [u] [v] = W;} dfs1 (1, 1, 0 ); cout <max <Endl; return 0 ;}
Wikioi 1043 bidirectional DFS