C ++ recogiendo cacahuetes (programación dinámica)

Hello Kitty quiere recoger unos cacahuetes y dárselos a su Mickey Mouse favorito.
Llegó a un campo de maní rectangular con caminos en forma de cuadrícula (en la foto de abajo), entró por la esquina noroeste y salió por la esquina sureste.
Inserte la descripción de la imagen aquí

Hay una plántula de maní plantada en la intersección de cada camino en el campo, con varios cacahuetes en ella, y todos los cacahuetes se pueden recoger después de una plántula de maní.
Hello Kitty solo puede ir al este o al sur, no al oeste o al norte.
Pregúntale a Hello Kitty cuántos cacahuetes se pueden recoger como máximo.
Formato de entrada La
primera línea es un número entero T, que representa cuántos conjuntos de datos hay.
Lo siguiente son los datos del grupo T.
La primera fila de cada grupo de datos son dos números enteros, que representan el número de fila R y el número de columna C de plántulas de maní.
Las siguientes R filas de datos de cada grupo de datos describen la situación de cada fila de plántulas de maní de norte a sur. Cada fila de datos tiene C números enteros, que describen el número de cacahuetes M en cada plántula de cacahuete de la fila en orden de oeste a este.
Formato de salida
Para cada grupo de datos de entrada, salida una línea, el contenido es la cantidad máxima de cacahuetes que Hello Kitty puede recoger.
Rango de datos
1≤T≤100,1≤R, C≤100,0≤M≤1000
Ejemplo de entrada:
2
2 2
1 1
3 4
2 3
2 3 4
1 6 5
Ejemplo de salida:
8
16

Código AC:

#include<stdio.h>
#include<algorithm>

using namespace std;

int t;
int r,c;
int w[110][110];//各个格点上花生数
int f[110][110];//递推数组

int main()
{
    
    
    scanf("%d",&t);
    while(t--)
    {
    
    
        scanf("%d%d",&r,&c);
        for(int i=1;i<=r;++i)
            for(int j=1;j<=c;++j)
                scanf("%d",&w[i][j]);
        //求从(1,1)走到(i,j)的所有路线中的花生总和最大值
        //可以分解为两个子问题
        //1.从左边走到(i,j)
        //2.从上边走到(i,j)
        //f[i][j]选两个子问题的最大值即可
        for(int i=1;i<=r;++i)
            for(int j=1;j<=c;++j)
                f[i][j]=max(f[i][j-1],f[i-1][j])+w[i][j];
        printf("%d\n",f[r][c]);
    }
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_44643644/article/details/108835387
Recomendado
Clasificación