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
-
Etiqueta de algoritmo
- programaçao dinamica
- ambicioso
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;
}
};