(KEI) 1948. [Data] officiel NOIP2014 ensemble universel sous-matrice (sous-matrice. Cpp / c / pas)] [DFS + DP

(Fichier IO): entrée: submatrix.in sortie: submatrix.out
limite de temps: 1000 ms contraintes d'espace: 128000 KB restrictions spécifiques


Titre Description
est donnée à la définition suivante:
1. Matrices: Sélectionner une nouvelle matrice composée de certaines lignes et certaines colonnes d'une matrice à partir de laquelle la position d'intersection (tenant ordre opposé de la ligne des colonnes) est désigné comme un sous-matrice de la matrice d' origine.
Par exemple, sélectionner la deuxième à gauche en bas, et la deuxième rangée d'éléments 4, 4, 5 représenté dans la position transversale pour donner une sous - matrice 2 * 3 à droite.
Insérer ici l'image Description
2. éléments adjacents: un élément de la matrice avec son haut et vers le bas autour des quatre éléments ( le cas échéant) sont contiguës.
3. matrice de score: la matrice et la valeur absolue de la différence entre chacun de l'élément adjacent de.

La tâche du titre: étant donné un n lignes et m colonnes matrix entier positif, s'il vous plaît sélectionner une ligne de sous-matrice colonne de r c de cette matrice, de sorte que la valeur minimum de la sous-matrice, et délivre en sortie la valeur.


Entrez le
nom du fichier d'entrée est submatrix.in.
La première ligne contient quatre entiers séparés par un espace de n, m, r, c, que l'importance du problème, chacun séparé par un espace entre deux entiers.
Les lignes suivantes n, chaque ligne séparées par un espace comprenant m est un entier qui représente un problème en ce que la matrice de n rangées et m colonnes.

Sortie
fichier de sortie nommé submatrix.out.
Total des lignes de sortie, comprenant un nombre indiquant la valeur minimale pour répondre à la sous-matrice de l' objet décrit.


entrée d' échantillon
de l'échantillon 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

Echantillon Input2
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 sept 8
1 9 1 4 7 8 8
10 5 9 1 1 8 10
1 3 1 5 4 6 8

Exemple de sortie
de l'échantillon Output1
6.

Echantillon Output2
16


les données de restriction gamme
[Description de données]
pour 50% des données, 1 ≤ m≤ 12, 1 ≤ n ≤ 12, chaque élément de la matrice 1 ≤ a [i, j] ≤20,
à 100% des données, 1 ≤ m ≤ 16, 1 ≤ n ≤ 16 , chaque élément de la matrice 1 ≤ a [i, j] ≤1000,1 ≤ r <= n, 1 <= C <= m.


Tip
[O] Exemple Description 1
sous-matrice de la matrice et la plus petite valeur des lignes d' origine et trois colonnes dans la rangée de la matrice 4, ligne 5 de la première colonne, la troisième colonne, la position du quatrième élément de colonne se croisant composition, en tant que
Insérer ici l'image Description
sa valeur est | 6-5 | + | 5 - 6 | + | 7-5 | + | 5-6 | + | 6-7 | + | 5-5 | + | 6-6 | = 6 .

Echantillon 2 [O] décrit
la sous-matrice minimum matrice valeur de 3 lignes et 3 colonnes dans la rangée de la matrice originale 4, ligne 5, la ligne 6 et la deuxième colonne, la colonne 6, la colonne 7 Cross positions des éléments, la valeur minimale choisie de la sous-matrice
Insérer ici l'image Description


idées de résolution de problèmes
F S + P DFS + DP se sentent toutcoupje suis si paresseux. . (En fait, regardez le code sera en mesure de comprendre l'idée générale de celuici)


Code
ouverture 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);
}
Publié 119 articles originaux · a gagné les éloges 8 · vues 4932

Je suppose que tu aimes

Origine blog.csdn.net/kejin2019/article/details/104618888
conseillé
Classement