Pastel de monedas de oro

Enlace: https://ac.nowcoder.com/acm/contest/11371/E
Fuente: Niuke

Descripción del título
Recientemente, las vacas están ansiosas por envolver monedas de oro en harina y hornearlas en pasteles. El i-ésimo pastel contiene monedas de oro de Ni (1 <= Ni <= 25), y este número está claramente marcado en la superficie del pastel.
Las vacas organizaron todos los pasteles horneados sobre la hierba en una matriz con R filas (1 <= R <= 100) y C columnas (1 <= C <= 100). Estás parado al lado del pastel con coordenadas (1,1) Por supuesto, puedes obtener todas las monedas de oro en ese pastel. Debes caminar desde tu posición actual hasta el otro lado del césped y detenerte junto al pastel con coordenadas (R, C). Cada vez que haces un movimiento, debes ir a un trozo de pastel en la siguiente columna, y el número de filas no puede cambiar más de 1 (es decir, si estás parado al lado del pastel con coordenadas (r, c), A continuación, puede caminar hasta el pastel con coordenadas (r-1, c + 1), (r, c + 1) o (r + 1, c + 1)). Cuando pasas por un trozo de pastel, puedes quitar todas las monedas de oro del pastel. Por supuesto, no querrás perder tus útiles monedas de oro dejando la hierba a mitad de camino, pero al final deberás detenerte junto al pastel con coordenadas (R, C).
Ahora, tiene una tabla etiquetada con el número de monedas de oro en cada pastel en la matriz del pastel. Entonces, de acuerdo con las reglas, ¿cuánto oro puedes obtener como máximo?
Por ejemplo, las vacas organizan los pasteles en la siguiente matriz, y los números en la matriz indican la cantidad de monedas de oro en los pasteles en esa posición:

Punto de partida -> 6 5 3 7 9 2 7
2 4 3 5 6 8 6
4 9 9 9 1 5 8 <- Punto final La
siguiente es una ruta legal:

Punto de partida -> 6 5 3 7 9 2 7

2 4 3 5 6 8 6
\ /
4 9 9-9 1 5-8 <- El punto final es
seguir la ruta mencionada anteriormente, y puede obtener 6 + 4 + 9 + 9 + 6 en total + 5 + 8 = 47 monedas de oro. De acuerdo con las reglas, puede obtener hasta 50 monedas de oro en esta matriz. La ruta se muestra en la siguiente figura:

Punto de inicio -> 6 5 3 7 9 2 7

2 4 3 5 6-8 6
\ /
4 9 9-9 1 5 8 <- Punto final
(cópielo en el bloc de notas para verlo en letra monoespaciada)

Descripción de entrada:
Línea 1: Dos enteros separados por espacios, R y C
Línea 2 ... R + 1: Cada línea contiene C enteros positivos separados por espacios, lo que indica cada llenado de izquierda a derecha en una fila El número de monedas de oro en el gráfico circular
Descripción de salida:
Línea 1: Salida de un número entero positivo, que indica el número máximo de monedas de oro que puede recolectar
Ejemplo 1 Copia de
entrada 3 7 6 5 3 7 9 2 7 2 4 3 5 6 8 6 4 9 9 9 1 5 8 copia de salida 50







Dp simple, lo clave a tener en cuenta es el orden de enumeración, que es de izquierda a derecha, y algunas posiciones no se pueden caminar.

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <set>
#include <string>
#include <queue>
#include <map>
#include <stack>
#include <map>
#include <unordered_map>
#include <vector>
#include <cmath>
#include <ext/rope>
#include <bits/stdc++.h> 

using namespace std;

#define gt(x) x = read()
#define int long long

const int mod = 1e9 + 7;

inline int read(int out = 0)
{
    
    
    char c;
    while((c=getchar()) < 48 || c > 57);
    while(c >= 48 && c <= 57) out=out*10+c-48,c=getchar();
    return out; 
}

const int N = 110;
const int M = 1e6 + 10;

int n, m;
int a[N][N];
int f[N][N];

signed main(){
    
    
	ios::sync_with_stdio(false);
	cin.tie();
	cout.tie();
	
	gt(n), gt(m);
	
	for (int i = 1; i <= n; i ++){
    
    
		for (int j = 1; j <= m; j ++)
		  gt(a[i][j]);
	}
	
	f[1][1] = a[1][1];
	for (int i = 2; i <= n; i ++)   f[i][1] = 0;
	for (int j = 2; j <= m; j ++){
    
    
		for (int i = 1; i <= j; i ++){
    
    
			f[i][j] = max(f[i][j], f[i - 1][j - 1] + a[i][j]);
			f[i][j] = max(f[i][j], f[i + 1][j - 1] + a[i][j]);
			f[i][j] = max(f[i][j], f[i][j - 1] + a[i][j]);
		//	cout << i << " " << j << " " << f[i][j] << endl;
		}
	}
	
	cout << f[n][m] << endl;
	
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_45772483/article/details/112639904
Recomendado
Clasificación