[] Las explicaciones fuera de la calle

Pregunta

Reflejar que no quería salir pensamiento solidificó ...... ......

Set \ (dp [i] [j ] [0/1] \) representa el intervalo de \ (\ text {[i, j]} \) todos apagar las luces, y se detuvo en \ ((i-> 0, j- > 1) \) lugares costo mínimo.

Entonces, \ (DP [i] [j] [0] \) de ([0/1] \ dp [i + 1] [j]) \ transferencia, \ (DP [i] [j] [. 1] \ ) un \ (dp [i] [j -1] [0/1] \) de transferencia.

Tenga en cuenta que buscamos el intervalo cerrado \ (\ text {[i, j]} \) un mínimo de energía. Por lo tanto, nos desviamos de la luz de cada uno, que se utiliza para calcular el tiempo no está relacionada con todas las demás luces van más.

En otras palabras, cada vez que quiera una respuesta completa, que acaba de cerrar esta energía de luz para ser consumido.

Ya que no se actualizan, o una lámpara en cada nivel de estadísticas sobre el actual consumo de las luces causada por mucho tiempo, por lo que no hará que el recuento de peso.

Siguiente nota que esta ecuación, la orden de transferencia es \ (\ + I {texto. 1 a I, J-J. 1 a} \) , de modo que cuando la enumeración \ (I \) obligado inversa, \ (J \) necesariamente orden .

Considere cómo enumeración.

Obviamente que ya sabemos es \ (C \) respuesta, que la posición de partida del Padre. Así que nuestra respuesta debe basarse en esta posición para la propagación.

También tenga en cuenta que \ (i, j \) debería ser de \ (C \) iniciar, por lo que si:

\ (I = C \ a 1 , j = i \ a n \) , entonces nuestro \ (dp \) matriz puede ser correctamente actualizado.

Hay otra manera: se puede primera enumeración \ (J \) .

La enumeración: \ (J = C \ a n- ,. 1-I = J \ 1 a \.) , El mismo problema.

Por lo tanto, el código de dos puede proporcionar hi \ (\ Color Verde {} {} la AC \) .

#include<bits/stdc++.h>
using namespace std;
int n,c;
int a[500],w[500],p[500];
int dp[51][51][2];
inline int max(int x,int y){return x>y?x:y;}
inline int min(int x,int y){return x<y?x:y;}
int main(){
	scanf("%d%d",&n,&c);
	for(int i=1;i<=n;++i){
		scanf("%d%d",&a[i],&w[i]);
		p[i]=p[i-1]+w[i];
	}
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j)
			dp[i][j][1]=dp[i][j][0]=99999;
	dp[c][c][1]=dp[c][c][0]=0;
	for(int i=c;i>=1;--i){
		for(int j=i+1;j<=n;++j){
			dp[i][j][0]=min(dp[i+1][j][0]+(a[i+1]-a[i])*(p[i]+p[n]-p[j]),
							dp[i+1][j][1]+(a[j]-a[i])*(p[i]+p[n]-p[j]));
							
			dp[i][j][1]=min(dp[i][j-1][1]+(a[j]-a[j-1])*(p[i-1]+p[n]-p[j-1]),
							dp[i][j-1][0]+(a[j]-a[i])*(p[i-1]+p[n]-p[j-1]));
		}
	}
	printf("%d\n",min(dp[1][n][1],dp[1][n][0]));
	return 0;
}
#include<bits/stdc++.h>
using namespace std;
int n,c;
int a[500],w[500],p[500];
int dp[51][51][2];
inline int max(int x,int y){return x>y?x:y;}
inline int min(int x,int y){return x<y?x:y;}
int main(){
	scanf("%d%d",&n,&c);
	for(int i=1;i<=n;++i){
		scanf("%d%d",&a[i],&w[i]);
		p[i]=p[i-1]+w[i];
	}
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j)
			dp[i][j][1]=dp[i][j][0]=99999;
	dp[c][c][1]=dp[c][c][0]=0;
	for(int j=c;j<=n;++j){
		for(int i=j-1;i>=1;--i){
			dp[i][j][0]=min(dp[i+1][j][0]+(a[i+1]-a[i])*(p[i]+p[n]-p[j]),
							dp[i+1][j][1]+(a[j]-a[i])*(p[i]+p[n]-p[j]));
							
			dp[i][j][1]=min(dp[i][j-1][1]+(a[j]-a[j-1])*(p[i-1]+p[n]-p[j-1]),
							dp[i][j-1][0]+(a[j]-a[i])*(p[i-1]+p[n]-p[j-1]));
		}
	}
	printf("%d\n",min(dp[1][n][1],dp[1][n][0]));
	return 0;
}

Dos código de orden de enumeración es diferente, pero por todas partes.

Resumen: \ (DP \) cuando la primera nota del estado de diseño, y la atención del estado en el que la puesta en marcha, y luego considerar \ (DP \) enumeración método.

La reflexión. Plato es el pecado original

Supongo que te gusta

Origin www.cnblogs.com/h-lka/p/12623558.html
Recomendado
Clasificación