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: 755 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 |
E-Books em PDF |
||||
|
||||
|
||||
Linguagens Mais Populares |
||||
|
1º lugar: Java |






