Dirección: https://www.acwing.com/problem/content/284/
Tema: Dar un montón de piedras, fusiones adyacentes, preguntar el costo mínimo, el algoritmo específico está en la pregunta.
Resolución:
Para esta pregunta, según el sentido común, para el estado final, los dos grupos se fusionaron. Por lo tanto, defina dp [i] [j] para representar el valor mínimo de la fusión del intervalo ij.
Se fusionan dos pilas: dp [1] [2] = dp [1] [1] + dp [2] [2] + suma [1 ~ 2];
即 dp [i] [i + 1] = dp [i] [i] + dp [i + 1] [i + 1] + suma [i ~ i + 1];
Tres pilas combinadas: dp [1] [3] = min (dp [1] [1] + dp [2] [3], dp [1] [2] + dp [3] [3]) + suma [1 ~ 3];
dp [i] [i + 2] = min (dp [i] [i] + dp [i + 1] [i + 2], dp [i] [i + 1] + dp [i + 2] [i +2]) + suma [i ~ i + 2];
En resumen, se extiende a la fusión de la pila i-ésima con la pila j-ésima, dp [i] [j] = min (dp [i] [j], dp [i] [k] + dp [k + 1] [j] + suma [j] -sum [i-1]);
Tres fors es equivalente a atravesar cada intervalo de longitud.
Se siente un poco flojo ... Encuentra un punto de tránsito
#include <iostream> #include <cstdio> #include <cstring> const int maxn = 500 ; const int inf = 1e9; int dp [maxn] [maxn]; int a [maxn], suma [maxn]; usando el espacio de nombres estándar; int main () { int n; cin >> n; suma [ 0 ] = 0 ; para ( int i = 1 ; i <= n; i ++ ) { cin >> a [i]; sum [i] = suma [i- 1 ] + a [i]; } for ( int len = 2 ; len <= n; len ++ ) { for ( int l = 1 ; l + len- 1 <= n; l ++ ) { int r = l + len- 1 ; dp [l] [r] = inf; para ( int k = l; k <r; k ++ ) { dp [l] [r] = min (dp [l] [r], dp [l] [k] + dp [k + 1 ] [r] + suma [r] -sum [l- 1 ]); } } } cout << dp [ 1 ] [n] << endl; }