[蓝 桥 杯] Consigue un tesoro del palacio subterráneo

El rey X tiene una casa del tesoro en el palacio subterráneo, que es una matriz de cuadrículas n × m. Cada cuadrícula se coloca con un tesoro y cada tesoro se adjunta con una etiqueta de valor.

La entrada al palacio subterráneo está en la esquina superior izquierda y la salida está en la esquina inferior derecha.

Xiao Ming fue llevado a la entrada del palacio subterráneo y el rey le pidió que caminara hacia la derecha o hacia abajo.

Al caminar a través de una cuadrícula, si el valor del tesoro en esa cuadrícula es mayor que el de cualquier tesoro en las manos de Xiao Ming, Xiao Ming puede recogerlo (por supuesto, no es necesario que lo tome).

Cuando Xiao Ming camina hacia la salida, si los tesoros en su mano resultan ser k piezas, estos tesoros pueden ser entregados a Xiao Ming.

Ayude a Xiaoming a calcular cuántos planes de acción diferentes tiene para obtener estos k tesoros en una situación determinada.

Formato de entrada La
primera línea de 3 enteros, n, m, k, consulte la descripción del título para conocer el significado.

En las siguientes n filas, cada fila tiene m enteros Ci que se utilizan para describir el valor del tesoro de cada cuadrícula de la matriz de la casa del tesoro.

Formato de
salida Genera un número entero, lo que significa que se toma exactamente el número de planes de acción para k bebés.

Este número puede ser muy grande y generar el resultado del módulo 1000000007.

Rango de datos
1≤n, m≤50,
1≤k≤12,
0≤Ci≤12
Ejemplo de entrada 1:
2 2 2
1 2
2 1
Ejemplo de salida 1:
2
Ejemplo de entrada 2:
2 3 2
1 2 3
2 1 5
muestra de salida 2:
14

Ideas para la resolución de problemas:
Primero, definimos dp [i] [j] [cnt] [k] en el sentido de que Xiao Ming caminó desde la esquina superior izquierda hasta (i, j) y tomó elementos cnt con un valor total de k. En este problema, el rango de valores es (0,12), lo que significa que los elementos en varios puntos del mapa pueden tener un valor de 0, por lo que cuando leemos los datos, cada dato es +1, por lo que el rango de valores se convierte en (1,13), para que podamos considerar el problema de inicialización, y luego pensemos en la expresión relacional, en este punto se puede tomar o no, si no, el código es el siguiente:

dp[i][j][cnt][v] = (dp[i][j][cnt][v] + dp[i - 1][j][cnt][v]) % MOD;
dp[i][j][cnt][v] = (dp[i][j][cnt][v] + dp[i][j - 1][cnt][v]) % MOD;

Debe escribirse por separado aquí, y el resultado es% MOD; de lo contrario, los datos se desglosarán, y luego el elemento que Xiaoming toma cada vez es más grande que el elemento anterior. Luego, si el elemento en este punto se puede tomar, debe estar en línea:
el valor del artículo en este punto es igual a nosotros El valor de k en dp [i] [j] [cnt] [k], y si se toma el artículo, cnt debe ser mayor que 0, y luego tenemos que considerar cómo inicializar. En el punto de partida, Xiao Ming puede o no tomar el elemento Este elemento, así que si no lo tomas, dp [1] [1] [0] [0] = 1, tome este elemento dp [1] [1] [1] [w [1] [1]]

el código se muestra a continuación:

#include <iostream>
using namespace std;
const int N = 55;
const int MOD = 1000000007;
int dp[N][N][15][15];
int w[N][N];
int n, m, k;

int main() {
    
    
	cin >> n >> m >> k;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++) {
    
    
			cin >> w[i][j];
			w[i][j]++;
		}

	dp[1][1][0][0] = 1;
	dp[1][1][1][w[1][1]] = 1;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			for (int cnt = 0; cnt <= k; cnt++)
				for (int v = 0; v <= 13; v++) {
    
    
					dp[i][j][cnt][v] = (dp[i][j][cnt][v] + dp[i - 1][j][cnt][v]) % MOD;
					dp[i][j][cnt][v] = (dp[i][j][cnt][v] + dp[i][j - 1][cnt][v]) % MOD;

					if (cnt > 0 && w[i][j] == v) {
    
    
						for (int s = 0; s < v; s++) {
    
    
							dp[i][j][cnt][v] = (dp[i][j][cnt][v] + dp[i - 1][j][cnt - 1][s]) % MOD;
							dp[i][j][cnt][v] = (dp[i][j][cnt][v] + dp[i][j - 1][cnt - 1][s]) % MOD;

						}
					}
				}

	int res = 0;
	for (int i = 0; i <= 13; i++) {
    
    
		res = (res + dp[n][m][k][i]) % MOD;
	}

	cout << res << endl;
	return 0;

}

Supongo que te gusta

Origin blog.csdn.net/m0_51955470/article/details/114421209
Recomendado
Clasificación