Exámenes del azul del puente - toman el tesoro palacio subterráneo (programación dinámica)

tema:

Aquí Insertar imagen Descripción

Aquí Insertar imagen Descripción

análisis:

El sujeto se conoce el uso de programación dinámica para resolver fácilmente un dp de cuatro dimensiones matriz de conjuntos [55] [55] [ 15] [15], esta matriz para almacenar el número actual de los programas de acción, los datos de rango dado por parte del sujeto se puede inferir configurar la matriz de memoria no explota, dp [i] [j] [k] [c] definimos como a (i, j) en este punto, para obtener k elementos, y el valor máximo es menor que los elementos actuales c número de programas, se puede especular que las siguientes situaciones:

  • Cuando estera [i] [J]> el valor de corriente máxima (mat [i] [J] denotan ubicado (i, j) valor de la coordenada del artículo), es decir en este momento si usted quiere tomar distancia (i, j) coordinar artículos, se encuentra (i-1, j) y (i, j-1) es menor que el valor de las coordenadas ciertamente mat [i] [j], entonces el tiempo estableció un tmp1
    tmp1 DP = [. 1-I] [J ] [k-1] [estera [i] [J]] + dp [i] [J-1] [k-1] [estera [i] [J]]

  • Independientemente de cuando la estera de [i] [j] es mayor que el valor máximo de corriente, puede elegir no tomar ubicado (i, j) del artículo, cuando la estera de [i] [j] valor es inferior a la corriente máxima, no se puede quitar (i , j) del artículo, por lo que si es mayor o menor que, no tome esta situación existe, en cuyo caso un conjunto TMP2
    TMP2 DP = [. 1-i] [j] [K] [C] + DP [I] [ j-1] [k] [ c]

Finalmente dp [i] [j] [ k] [c] = (tmp1% mod + TMP2% mod)% mod el número del programa actual para obtener
el dp final de salida [n] [m] [ k] [13]

código:

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

const int MOD = 1e9+7;
int mat[55][55];
int dp[55][55][15][15];
int n,m,k,ans;

int main()
{
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)
            scanf("%d",&mat[i][j]);
    int tmp1,tmp2;
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)
            for(int l=0;l<=k;++l)
                for(int c=0;c<=13;++c)
                {
                    tmp1 = 0;
                    if(i==1&&j==1)   //此处表示初始条件
                    {
                        if(l==0) dp[i][j][l][c] = 1;
                        if(l==1&&c>mat[i][j]) dp[i][j][l][c]=1;
                        continue;
                    }
                    if(c>mat[i][j]&&l) tmp1 = dp[i-1][j][l-1][mat[i][j]] + dp[i][j-1][l-1][mat[i][j]];
                    tmp2 = dp[i-1][j][l][c] + dp[i][j-1][l][c];
                    dp[i][j][l][c] = (tmp1%MOD+tmp2%MOD)%MOD;
                }
    printf("%d\n",dp[n][m][k][13]);
    return 0;
}

Publicado 61 artículos originales · ganado elogios 7 · vistas 3640

Supongo que te gusta

Origin blog.csdn.net/weixin_42469716/article/details/104569600
Recomendado
Clasificación