Leetcode 673. El número de la subsecuencia creciente más larga (DÍA 49) ---- Período de aprendizaje de programación dinámica (escriba otra pregunta para comer, esta pregunta contiene soluciones detalladas)

Titulo original

Inserte la descripción de la imagen aquí



Implementación de código (primer pincel de resolución automática)

int findNumberOfLIS(int* nums, int numsSize){
    
    
    if(!numsSize)   return 0;

    //dp记录当前数字的最长递增序列长度 paths记录当前数字的最长递增序列共有几种路径
    int dp[2001],paths[2001],i,j,max = 1,ret = 0;
    for(i=0;i<numsSize;i++)
    {
    
    
        dp[i] = 1;//至少长度为1
        paths[i] = 1;//至少一种路径
        for(j=0;j<i;j++)
        {
    
    
            if(nums[i] > nums[j])
            {
    
    
                //当我们现在的长度比原来长度+1小的时候
                //替换当前长度 并记录当前长度有几种路径
                if(dp[j] + 1 > dp[i])
                {
    
    
                    dp[i] = dp[j] + 1;
                    paths[i] = paths[j];
                }
                else if(dp[j] + 1 == dp[i])//else if意味着当重复出现当前长度时 我们只需要往上面叠加路径数即可
                    paths[i] += paths[j];
            }
        }
        if(dp[i] > max) //当大于目前现有最大自序列个数时 替换并且记录
        {
    
    
            max = dp[i];
            ret = paths[i];
        }
        else if(dp[i] == max) //当重复出现最大最大自序列长度时 叠加长度即可
            ret += paths[i];
    }
    return ret;
}

Supongo que te gusta

Origin blog.csdn.net/qq_37500516/article/details/113862183
Recomendado
Clasificación