Programación dinámica cepillado día 02 (la subsecuencia de ventana más pequeña, el cuadrado más grande bordeado por 1)

1. Subsecuencia de ventana mínima de Leetcode 727 (dp registra la posición inicial y se calcula la longitud)

T S y la cadena dada, buscando en las subcadenas continuas mínimas W S tal que W T es la secuencia (orden) . Si no se encuentra, devuelve "". Si se encuentran varias subcadenas con la longitud más pequeña, devuelve la que tiene el índice izquierdo más pequeño.

https://blog.csdn.net/weixin_45588823/article/details/100642933

2. Subcadena de cobertura mínima de Leetcode 76

La diferencia con 727 es "dadas las cadenas de caracteres S y T, busque la subcadena continua más pequeña W en S para que W contenga todos los caracteres en T, es decir, puede estar fuera de orden ".

La idea es el puntero de cabeza y cola, la cola sigue caminando hacia atrás hasta que contiene completamente T, y luego comienza a caminar (mientras camina mientras se registra la subcadena más corta) hasta que no contiene completamente T, y luego continúa caminando con la cola , repitiendo (siguiendo) Un rato, incluido un rato)

https://blog.csdn.net/whdAlive/article/details/81132383

3. Leetcode 1139 El cuadrado más grande bordeado por 1

Pensé en la idea. Es similar al cuadrado anterior. Use [i] [j] como la esquina inferior derecha para registrar dos dp (el más largo va hacia la derecha y el más largo sube), y luego de estos dos Elija uno pequeño, enumere la longitud del lado de este cuadrado de grande a pequeño , determine si es factible y registre ans. (Quería grabar cuatro bordes, pero descubrí que solo dos bordes están relacionados con la esquina inferior derecha, y los bordes aún no están enumerados, por lo que es mejor registrar dos bordes)

class Solution {
public:
    int largest1BorderedSquare(vector<vector<int>>& grid) {
        if (grid.size()==0 || grid[0].size()==0) return 0;
        int n=grid.size(),m=grid[0].size();
        int ans=0;
        //f[i][j][0]表示往左最长,f[i][j][1]表示往上最长
        int f[n+10][m+10][2];
        memset(f,0,sizeof(f));
        for (int i=1;i<=n;i++)
            for (int j=1;j<=m;j++)
            if (grid[i-1][j-1]==1)
            {
                f[i][j][0]=f[i][j-1][0]+1;
                f[i][j][1]=f[i-1][j][1]+1;

                int maxlen=f[i][j][0];
                if (f[i][j][1]<maxlen) maxlen=f[i][j][1];
                
                for (int k=maxlen;k>ans;k--)
                {
                    if (f[i][j-k+1][1]>=k && f[i-k+1][j][0]>=k)
                    {
                        ans=k;
                        break;
                    }
                }
            }
        return ans*ans;
            
    }
};

https://leetcode-cn.com/problems/largest-1-bordered-square/solution/java-dong-tai-gui-hua-by-resolmi/

4.

Supongo que te gusta

Origin blog.csdn.net/hbhhhxs/article/details/107629892
Recomendado
Clasificación