acwing 1027. acceso cuadrado
https://www.acwing.com/problem/content/1029/
Para caminar una vez, la ecuación de transición de estado es fácil de obtener: $ f [i] [j] = max (f [i-1] [j], f [i] [j-1]) + w [i] [j] $.
Y para dos caminatas, establezca el estado en $ f [i_1] [j_1] [i_2] [j_2] $ significa que la primera ruta va de $ (1, 1) $ a $ (i_1, j_1) $, la primera La suma máxima de las dos rutas de $ (1, 1) $ a $ (i_2, j_2) $.
El núcleo de esta pregunta es: cómo lidiar con la misma cuadrícula no se puede tomar dos veces. El análisis muestra que solo cuando $ i_1 + j_1 = i_2 + j_2 $, la cuadrícula puede ser la misma cuadrícula, lo que también nos inspiró a reducir el estado en una dimensión.
Use $ k = i_1 + j_1 = i_2 + j_2 $, para que el estado se convierta en $ f [k] [i_1] [i_2] $.
1 #include <iostream> 2 #include <algorithm> 3 4 usando el espacio de nombres std; 5 6 const int N = 15 ; 7 8 int n; 9 int w [N] [N]; 10 int f [N * 2 ] [N] [N]; 11 12 int main () 13 { 14 cin >> n; 15 16 int a, b, c; 17 while (cin >> a >> b >> c, a || b || c) w [a] [b] = c; 18 años 19 para ( int k = 2 ; k <= n + n; k ++ ) 20 para ( int i1 = 1 ; i1 <= n; i1 ++ ) 21 para ( int i2 = 1 ; i2 <= n; i2 ++ ) 22 { 23 int j1 = k - i1, j2 = k - i2; 24 if (j1> = 1 && j1 <= n && j2> = 1 && j2 <= n) 25 { 26 int t = w [i1] [j1]; 27 si(i1! = i2) t + = w [i2] [j2]; 28 int & x = f [k] [i1] [i2]; 29 x = max (x, f [k - 1 ] [i1 - 1 ] [i2 - 1 ] + t); 30 x = max (x, f [k - 1 ] [i1 - 1 ] [i2] + t); 31 x = max (x, f [k - 1 ] [i1] [i2 - 1 ] + t); 32 x = max (x, f [k - 1 ] [i1] [i2] + t); 33 } 34 } 35 36 cout << f [n + n] [n] [n] << endl; 37 devuelve 0 ; 38 }