[Solução para problema de algoritmo] Soma máxima de submatrizes consecutivas

Soma máxima de submatrizes consecutivas

tema

Insira uma matriz inteira não vazia . Os números na matriz podem ser positivos ou negativos.

Um ou vários inteiros consecutivos na matriz formam uma submatriz.

Encontre a soma máxima de todas as submatrizes.

A complexidade de tempo necessária é O(n).

intervalo de dados

Comprimento da matriz [1,1000].
O intervalo de valores dos elementos na matriz é [−200.200].

Amostra
输入:[1, -2, 3, 10, -4, 7, 2, -5]

输出:18

Solução 1: programação dinâmica

  • dp [ eu ] dp[i]d p ​​[ i ]为以nums [ i ] nums[i]n u m s [ i ] é a submatriz com a maior soma entre as submatrizes no final
  • Existem duas transferências possíveis, uma não é iiA submatriz na frente de i , de nums [i] nums[i]n u m s [ i ] começa como um novo subarranjo; um é enums [ i − 1 ] nums[i-1]n você m s [ eu-1 ] e os números antes dele formam uma submatriz, pegue o máximo em ambos os casos
  • Equação de transição de estado:

dp [ i ] = max { dp [ i − 1 ] + nums [ i ] nums [ i ] dp[i]=max\begin{casos} dp[i-1]+nums[i]\\ nums[i] \end{casos}d p ​​[ eu ]=máximo _{ d p ​​[ eu-1 ]+n você m s [ eu ]n você m s [ eu ]

  • Responder:

max ⁡ 0 ≤ i ≤ ndp [ i ] \max_{0\le i\le n} dp[i]0 eu nmáximod p ​​[ eu ]

//dp
class Solution {
public:
    const int N=1005;
    int maxSubArray(vector<int>& nums) {
        int dp[N];
        int ans=-205;
        for(int i=0;i<nums.size();i++){
            dp[i]=nums[i];
            if(i)dp[i]=max(dp[i],dp[i-1]+nums[i]);
            ans=max(ans,dp[i]);
        }
        return ans;
    }
};

Solução 2: ganancioso

  • Considere o iii个数nums [ i ] nums[i]Quando n u m s [ i ] , use uma soma somas você m registra o anteriori − 1 i-1eu-A maior combinação cumulativa consecutiva de subnúmeros de 1 número
  • se soma < 0 soma <0você é _<0 significa que não tem nenhuma contribuição útil para a soma do subarray e pode ser descartado.Denums [ i ] nums[i]n u m s [ i ] inicia um novo subarray; caso contrário,sum sumvocê é _
  • Use ans = max ⁡ isumi ans=\max_i sum_ium s=máx.euvocê é _euRegistre a resposta porque soma somas você m pode atingir um valor máximo no meio e depois se tornar menor
  • nota e respostaA inicialização de um s deve começar no limite inferior em vez de0 00
//贪心
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int sum=0,ans=-205;
        for(int i=0;i<nums.size();i++){
            if(sum<0) sum=nums[i];
            else sum+=nums[i];
            ans=max(ans,sum);
        }
        return ans;
    }
};

Guess you like

Origin blog.csdn.net/u011459717/article/details/128501244