poj3280 configurado de cordaje mínimo coste palíndromo - dp intervalo

El significado de los problemas

pensamiento

dp [i] [j] se almacena en esta sección i ~ j y la solución óptima ha sido palindromic

Así que cuando nos preguntamos nueva sección i ~ j Basta tener los s [i]? = S [j]

si (s [i] == s [j]) dp [i] [j] = min (dp [i] [j], dp [i 1] [j - 1]);

más dp [i] [j] = min (dp [[i] [j], min (dp [i + 1] [j] + Chan [s [i]], dp [i] [j - 1] + Chan [s [j]]));

Cada matriz de caracteres Chan min (add, reducir), esto es porque cuando cada lado de s [i]! = Tiempo de s [j] a la dp [i 1] [j] transforma en una s [i] puede estar en el i bit de descarte o s [j] añadido algo detrás de s [i] así el costo + = min (add, reducir) dp [i] [j - 1] es el mismo procedimiento

Cada dp [i] [j] representa una solución óptima palíndromo en esta sección es el sucesor directo de como ningún efecto secundario no afectará a la parte posterior respuesta

ACcode

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>

using namespace std;
const int inf = 0x3f3f3f3f;

int n,len;
char op;
char s[2005];
int ad[30],re[30],chan[30];
int dp[2005][2005];

int main()
{
	scanf("%d %d",&n,&len);
	scanf("%s",s + 1);
	s[0] = '#',s[len + 1] = '#';
	for(int i = 1;i <= n; i++){
		scanf(" %c",&op);
		int cur = op - 'a';
		scanf("%d %d",&ad[cur],&re[cur]);
		chan[cur] = min(ad[cur],re[cur]);
	}
	memset(dp,0,sizeof dp);
	for(int i = 1;i <= len; i++){
		for(int j = i;j <= len; j++) dp[i][j] = inf;
	}
	for(int L = 1;L <= len; L++){
		for(int i = 1;i + L - 1 <= len; i++){
			int j = i + L - 1;
			if(s[i] == s[j]) dp[i][j] = min(dp[i][j],dp[i + 1][j - 1]);
			else dp[i][j] = min(dp[i][j],min(dp[i + 1][j] + chan[s[i] - 'a'],dp[i][j - 1] + chan[s[j] - 'a']));
		}
	}
	printf("%d\n",dp[1][len]);
}

 

Publicado 31 artículos originales · ganado elogios 5 · Vistas 1367

Supongo que te gusta

Origin blog.csdn.net/qq_43685900/article/details/102817275
Recomendado
Clasificación