(KEI) 1948. [Datos] NOIP2014 Oficial conjunto submatriz universal (submatriz. Cpp / c / PAS)] [DFS + DP

(Archivo IO): Entrada: submatrix.in de salida: submatrix.out
límite de tiempo: 1000 ms limitaciones de espacio: las restricciones específicas 128000 KB


Título Descripción
se da la siguiente definición:
1. Matrices: seleccionar una nueva matriz compuesta de ciertas filas y ciertas columnas de una matriz de la que se hace referencia a la posición de intersección (sosteniendo orden línea opuesta de las columnas) como una sub-matriz de la matriz original.
Por ejemplo, seleccionar la segunda a la izquierda abajo, y la segunda fila de elementos de 4, 4, 5 se muestra en la posición transversal para dar una submatriz 2 * 3 a la derecha.
Aquí Insertar imagen Descripción
2. Elementos adyacentes: un elemento de la matriz con su arriba y hacia abajo alrededor de los cuatro elementos (si los hay) son adyacentes.
3. matriz de puntuación: la matriz y el valor absoluto de la diferencia entre cada uno de los elemento adyacente de.

La tarea del título: dado un n filas y columnas matriz M entero positivo, por favor, seleccione una fila submatriz columna r c de esta matriz, de modo que el valor mínimo de la submatriz, y emite el valor.


Introduzca el
nombre del archivo de entrada se submatrix.in.
La primera fila contiene cuatro enteros separados por un espacio de n, m, r, c, ya que la importancia del problema, cada uno separado por un espacio entre dos números enteros.
Los siguientes n líneas, cada línea separados por un espacio que comprende m es un número entero que representa un problema porque la matriz de n filas ym columnas.

Salida
de archivo de salida llamado submatrix.out.
línea de salida total, que comprende un número entero que indica el valor mínimo para satisfacer el sujeto sub-matriz descrita.


entrada de la muestra
de la Muestra Input1
. 5 2. 3. 5
. 9. 3. 3. 3. 9
. 9. 7. 8. 4. 4
. 1. 4. 6. 7. 6
. 6. 8. 9. 5. 6
. 7. 4. 5. 6. 1

Muestra Entrada2
7 7 3 3
7 7 7 6 2 10 5
5 8 8 2 1 6 2
2 9 5 5 6 1 7
7 9 3 6 1 7 8
1 9 1 4 7 8 8
10 5 9 1 1 8 10
1 3 1 5 4 8 6

Ejemplo de salida
de la Muestra Output1
. 6

Muestra Salida2
16


datos de restricción de la gama
[descripción de datos]
para 50% de los datos, 1 ≤ m≤ 12, 1 ≤n ≤ 12, cada elemento de la matriz 1 ≤ a [i, j] ≤20;
a 100% de los datos, 1 ≤ m ≤ 16, 1 ≤ n≤ 16 , cada elemento de la matriz 1 ≤ a [i, j] ≤1000,1 ≤ r <= n, 1 <= c <= m.


Tip
[O] Muestra Descripción 1
submatriz de la matriz y el valor más pequeño de las filas originales y tres columnas en la fila de la matriz 4, fila 5 de la primera columna, tercera columna, la posición cuarto elemento de columna de intersección composición, como
Aquí Insertar imagen Descripción
su valor es | 6 - 5 | + | 5 - 6 | + | 7-5 | + | 5 - 6 En | + | 6 - 7 | + | 5-5 | + | 6 - 6 | = 6 .

Muestra 2 [O] describe
el valor mínimo de la matriz sub-matriz de 3 filas y 3 columnas de la fila matriz original 4, línea 5, línea 6 y la segunda columna, la columna 6, Columna 7 Cross posiciones de los elementos, el valor mínimo elegido de la sub-matriz
Aquí Insertar imagen Descripción


Ideas de resolución de problemas
re F S + re PAG DFS + DP repente siento que soy tan perezoso. . (De hecho, vistazo al código será capaz de comprender la idea general de la misma)


Código
apertura Yiyanbuge

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
int m,n,ans=2147483647,x,y,r,c,hh[100][100],f[100],a[100][100],bsy[100][100],b[100];
void dp(){
    memset(hh,0,sizeof(hh));
	memset(bsy,0,sizeof(bsy));
	memset(f,0,sizeof(f));
	b[r+1]=b[r];
	for(int i=1;i<=m;i++){
		for(int j=1;j<=r;j++)
			f[i]+=abs(a[b[j]][i]-a[b[j+1]][i]); 
	}
	for(int i=1;i<=m;i++){
		for(int j=i+1;j<=m;j++){
			for(int k=1;k<=r;k++)
			bsy[i][j]+=abs(a[b[k]][i]-a[b[k]][j]);
		}
	}
	for(int i=1;i<=m;i++)
		hh[1][i]=f[i];
	for(int i=2;i<=c;i++){
		for(int j=i;j<=m;j++){
			int t=2147483647;
			for(int k=i-1;k<j;k++){
				t=min(t,hh[i-1][k]+bsy[k][j]);
			}
			hh[i][j]=t+f[j];
		}
	}
	for(int i=c;i<=m;i++)
		ans=min(hh[c][i],ans);
}
void dfs(int x){
	if(y==r)
	{
		dp();
		return;
	}
	for(int i=x+1;i<=n;i++)
	{
		y++;
		b[y]=i;
		dfs(i);
		y--;
	}
}
int main()
{
    freopen("submatrix.in","r",stdin);
    freopen("submatrix.out","w",stdout);
    cin>>n>>m>>r>>c;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
            cin>>a[i][j];
    dfs(0);
    printf("%d",ans);
}
Publicados 119 artículos originales · ganado elogios 8 · vistas 4932

Supongo que te gusta

Origin blog.csdn.net/kejin2019/article/details/104618888
Recomendado
Clasificación