Ruta digital (búsqueda memorizada)

Prefacio

Esta pregunta es una pregunta de bronce de 2019ICPC Nanjing, y es una pregunta de búsqueda obvia memorizada. Pero vale la pena aprender algunas técnicas de optimización para este problema.

Título

Dado un n ∗ mn ∗ mLa matriz numérica de n m , comenzando desde cualquier posición, solo puede subir, bajar, izquierda y derecha una cuadrícula a la vez, y la siguiente posición debe ser 1 más grande que la posición actual. Si puede continuar retrocediendo, no puede detenerse. Encuentre el número total Un camino con una longitud mayor o igual a 4.

rango de datos

1 ≤ n, m ≤ 1000 1 \ leq n, m \ leq 1000 1n ,metro1 0 0 0
- 1 0 9 ≤ ai, j ≤ 1 0 9-10 ^ 9 \ leq a_ {i, j} \ leq 10 ^ 9- 1 09unai , j1 09

Ideas

De hecho, esta pregunta es muy similar a la pregunta anterior sobre el esquí, aunque esta pregunta agrega un límite de longitud, aún se puede pensar en ella memorizando la búsqueda. La búsqueda memorizada se puede transformar en hacer dp en orden topológico en un DAG, y este problema es el mismo.
f (yo, j, k) f (yo, j, k)f ( yo ,j ,k ) significa(i, j) (i, j)( yo ,j ) es el punto final y la longitud eskkEl número de k caminos. Porque siempre que la longitud sea mayor o igual a 4, cumple con los requisitos, por lo que la longitud mayor o igual a 4 se puede clasificar en una categoría, es decir,1 ≤ k ≤ 4 1 \ leq k \ leq 41k4 .
Además, establezca dos matrices en [i] [j] y fuera [i] [j] para registrar el grado de entrada y el grado de salida de cada punto. El punto con un grado de entrada de 0 es el punto de inicio de la ruta, y el punto con un grado de salida de 0 es El final del camino.
Haga el orden topológico dp del gráfico, y la ecuación de transición de estado se puede escribir de la siguiente manera:f (tx, ty, k) = (f (tx, ty, k) + f (x, y, k - 1))% modf (tx, ty, k) = (f (tx, ty, k) + f (x, y, k-1)) \% modf ( t x ,t y ,k )=( f ( t x ,t y ,k )+f ( x ,y,k-1 ) ) % m o d

Código

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>

using namespace std;

const int N = 1010, mod = 1e9 + 7;

typedef pair<int,int> pii;

int n, m;
int g[N][N], in[N][N], out[N][N], f[N][N][5];
int dx[4] = {
    
    0,1,0,-1}, dy[4] = {
    
    1,0,-1,0};

void topsort()
{
    
    
    queue<pii> que;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            if(!in[i][j])
            {
    
    
                que.push({
    
    i,j});
                f[i][j][1] = 1;
            }
    
    while(que.size())
    {
    
    
        auto t = que.front();
        que.pop();
        int x = t.first, y = t.second;
        for(int i=0;i<4;i++)
        {
    
    
            int tx = x + dx[i], ty = y + dy[i];
            if(tx<1||tx>n||ty<1||ty>m) continue;
            if(g[tx][ty]==g[x][y]+1)
            {
    
    
                f[tx][ty][2] = (f[tx][ty][2] + f[x][y][1]) % mod;
				f[tx][ty][3] = (f[tx][ty][3] + f[x][y][2]) % mod;
				f[tx][ty][4] = (f[tx][ty][4] + f[x][y][3] + f[x][y][4]) % mod;
				if(--in[tx][ty]==0)	que.push({
    
    tx,ty});
            }
        }
    }
}

int main()
{
    
    
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            scanf("%d",&g[i][j]);
    
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            for(int k=0;k<4;k++)
            {
    
    
                int tx = i + dx[k], ty = j + dy[k];
                if(tx<1||tx>n||ty<1||ty>m) continue;
                if(g[tx][ty]==g[i][j]+1) out[i][j] ++;
                if(g[tx][ty]==g[i][j]-1) in[i][j] ++;
            }
    
    int res = 0;
    topsort();
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            if(!out[i][j])
                res = (res + f[i][j][4]) % mod;
    
    printf("%d\n",res);
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_43634220/article/details/108477466
Recomendado
Clasificación