Você está aqui: Java ::: Desafios e Lista de Exercícios Resolvidos ::: Arrays e Matrix (Vetores e Matrizes) |
Como encontrar a soma máxima em uma subsequência de tamanho k em Java - Programação Dinâmica em Java - Lista de Exercícios Resolvidos de JavaQuantidade de visualizações: 532 vezes |
Pergunta/Tarefa: Este desafio, presente em quase todos os livros de programação dinâmica em Java, envolve encontrar a soma máxima em um subarray contíguo, ou seja, de elementos consecutivos, obedecendo a um tamanho k. O tamanho k determina a quantidade de elementos que a subsequencia pode ter. É possível ter mais de um subarray de tamanho k que contenha a soma máxima, mas o exercício pede para retornar apenas a soma máxima. Em outras abordagens do site eu mostro como retornar a quantidade de subarrays e até mesmo os índices de início e término de cada uma dessas subsequencias. Assim, dado o vetor v[] de números inteiros [-7, 1, 3, 11, 5, -4, 9, 2], encontre a maior soma que pode ser obtida por uma sequencia contígua de 3 elementos. Sua saída deverá ser parecida com: O conteúdo do array é: [-7, 1, 3, 11, 5, -4, 9, 2] A soma máxima é: 19 Resposta/Solução: Veja a resolução comentada deste exercício usando Java: Atenção: Existem muitos algorítmos refinados para uma solução mais eficiente deste problema. Aqui eu apresento a solução usando força-bruta. Essa é a forma mais ineficiente e que consome mais tempo e recursos da máquina. No entanto, esta é também a forma mais fácil de entender o algorítmo aplicado. package estudos; import java.util.Arrays; public class Estudos{ public static void main(String args[]){ // vamos criar um vetor com 8 elementos int valores[] = {-7, 1, 3, 11, 5, -4, 9, 2}; // vamos mostrar os valores do array System.out.println("O conteúdo do array é: " + Arrays.toString(valores)); // definimos o tamanho da subsequencia int k = 3; // e o tamanho do vetor int n = valores.length; // e chamamos a função que retorna a soma máxima int soma_maxima = soma_maxima_subarray_k(valores, n, k); // finalmente mostramos o resultado System.out.println("A soma máxima é: " + soma_maxima); } // método que recebe um vetor v e um número inteiro // k e retorna a maior soma que pode ser obtida por // uma subsequencia contígua de tamanho k static int soma_maxima_subarray_k(int arr[], int n, int k){ // o primeiro passo é declarar a soma // máxima como 0 int soma_maxima = 0; // agora percorremos os elementos do vetor, começando // no primeiro e indo até o elemento indicado pelo // tamanho do array menos o k for (int i = 0; i <= n - k; i++) { // criamos uma variável temporário com valor 0 int soma_temp = 0; // fazemos a soma dos elementos começando no // índice i atual e percorrendo // a quantidade de elementos k for (int j = i; j < i + k; j++) { // adicionamos o valor do elemento no índice j // à soma temporária soma_temp += arr[j]; } // a soma temporária é maior que a soma // que já temos? if (soma_temp > soma_maxima) { // a nova soma é a soma temporária soma_maxima = soma_temp; } } // retorna a soma máxima return soma_maxima; } } |
![]() |
Mais Desafios de Programação e Exercícios e Algoritmos Resolvidos de Java |
Veja mais Dicas e truques de Java |
Dicas e truques de outras linguagens |
GNU Octave - Como calcular o comprimento da hipotenusa em GNU Octave dadas as medidas do cateto oposto e do cateto adjascente |
E-Books em PDF |
||||
|
||||
|
||||
Linguagens Mais Populares |
||||
1º lugar: Java |