Acceso cuadrados (tablero de ajedrez DP)

título Descripción

Con n \ veces NN × cuadrados N FIG (N \ le 9) (N≤9), en el que la rejilla que llenar algunos entero positivo, mientras que el otro se coloca en la caja 00 números. Se muestra (ver ejemplos) como se muestra a continuación:

A
 0  0  0  0  0  0  0  0
 0  0 13  0  0  6  0  0
 0  0  0  0  7  0  0  0
 0  0  0 14  0  0  0  0
 0 21  0  0  0  4  0  0
 0  0 15  0  0  0  0  0
 0 14  0  0  0  0  0  0
 0  0  0  0  0  0  0  0
                         B

Alguien desde el punto de vista de la esquina superior izquierda de AA, se puede caminar hacia abajo, también se puede ir a la derecha hasta llegar a la esquina inferior derecha del punto BB. En el camino a través, se puede quitar el número de plazas (plaza será eliminado después de que las cifras son 00).
Esta persona ir de un punto a punto de BB AA total de dos, tratar de encontrar un camino tan 22, por lo que el número de adquirido y máximo.

Formato de entrada

Un primer acto entero de entrada NN (representada por N \ veces cuadrados NN × N FIG), cada línea tiene tres siguiente entero, indica la posición de los dos primeros, se colocan en el número de posiciones para el tercer número. Una línea separada 00 indica el final de la entrada.

Formato de salida

Sólo salida un entero que representa el camino 22 para obtener el máximo y.

entrada y salida de la muestra

Entrada # 1

8 
2 3 13 
2 6 6 
3 5 7 
4 4 14 
5 2 21 
5 6 4 
6 3 15 
7 2 14 
0 0 0

Salida # 1

67

ideas:

Con el código: 

  1. Puede solamente hacia abajo, o de inmediato, por lo tanto, igual al número de pasos a seguir, más ordenada abscisa
  2. Y un número conocido de pasos para ir a confirmar el tamaño de la abscisa de un punto
  3. número conocido de pasos, debe haber dos caminos que consisten en dos coordenadas (dos coordenadas pueden ser los mismos) 
  4. Así obtenido puede ser fórmula recursiva: dp [k] [i] [j] = max (max (dp [k-1] [i] [j], dp [k-1] [i] [j-1]) , max (dp [k-1] [i-1] [j], dp [k-1] [i-1] [j-1]) + a [i] [ki] + a [j]) [ kj];         
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
	int a[30][30]= {0},n,x,y,num,dp[30][30][30]= {0};
	cin>>n;
	do {
		cin>>x>>y>>num;
		a[x][y]=num;
	} while(x||y);   //输入
	for(int k=2; k<=n+n; k++) { //步数最大为n+n
		for(int i=n; i&&(k-i<=n); i--) { //k-i>n时,纵坐标会超出方格大小
			for(int j=n; j>=i&&(k-j<=n); j--) {	//j>=i :相对右边的坐标
				dp[k][i][j]=max(max(dp[k-1][i][j],dp[k-1][i][j-1]),max(dp[k-1][i-1][j],dp[k-1][i-1][j-1]));
				dp[k][i][j]+=a[i][k-i];
				if(i!=j)dp[k][i][j]+=a[j][k-j];  //如果两条路径终点不相同
			}
		}
	}
	cout<<dp[n+n][n][n]<<endl;
	return 0;
}

 

Publicado 42 artículos originales · alabanza ganado 16 · vistas 3404

Supongo que te gusta

Origin blog.csdn.net/qq_41542638/article/details/99015163
Recomendado
Clasificación