На рисунке изображен треугольник из чисел. Вычислить наибольшую сумму чисел, которые встречаются на пути, путь начинается с верхней точки треугольника и заканчивается на его основе. Шаг пути может быть вниз по диагонали влево или вниз по диагонали вправо. Треугольник из целых чисел от 1 до 99. Количество строк треугольника выбрать произвольно.
Олимпиадная и уже всем знакомая задачка, вот только у меня не выходит.
import java.util.Scanner;
public class Mountain
{
public static void main(String[] args)
{
int [][] a;
int [][] b;
int i;
int j;
System.out.println("Введите количество строк в треугольнике:");
Scanner value = new Scanner(System.in);
int n;
n= value.nextInt();
a=new int[n][];
b=new int[n][];
for(i=0; i<n; i++)
{
a[i]=new int[n];
b[i]=new int[n];
for(j=0; j<=i; j++)
{
b[i][j] = 0;
}
}
for(i=0; i<n; i++)
{
for(j=0; j<=i; j++)
{
Scanner valuefori = new Scanner(System.in);
Scanner valueforj = new Scanner (System.in);
int sizei = valuefori.nextInt();
int sizej = valueforj.nextInt();
i = sizei;
j=sizej;
a = new int [i][j];
b[0][0] = a[0][0];
}
}
for(i=0; i<n-1; i++)
{
for (j = 0; j <= i; j++) {
if (b[i + 1][j] < b[i][j] + a[i + 1][j])
{
b[i + 1][j] = b[i][j] + a[i + 1][j];
}
if (b[i + 1][j + 1] < b[i][j] + a[i + 1][j + 1])
{
b[i + 1][j + 1] = b[i][j] + a[i + 1][j + 1];
}
}
}
int max=b[n-1][0];
for(i=1; i<n; i++)
{
if (b[n - 1][i] > max)
{
max = b[n - 1][i];
}
}
System.out.println("Максимальная сумма " + max);
}
}
Вот так реализуете ввод массива
Scanner sc = new Scanner(System.in);
for(i=0; i<n; i++)
{
a[i]=new int[i+1];
b[i]=new int[i+1];
for(j=0; j<=i; j++)
{
int sizei = sc.nextInt();
a[i][j] = sizei;
b[i][j] = 0;
}
}
Задача решается рекурсивным обходом, где результат - это сумма текущего элемента и максимального из правого нижнего и левого нижнего треугольника
Сам треугольник удобно хранить в двумерном массиве с переменной длиной. Тогда будет разрешен спуск на следующую строку только на элемент с таким же индексом или на 1 больше. Т.е. треугольник
1
2 3
4 5 6
7 8 9 10
храним как
1
2 3
4 5 6
7 8 9 10
В итоге получаем
int getMaxTrace(int [][] a, int col, int row) {
int res = a[row][col];
if (row != a.length - 1) {
int left = getMaxTrace(a, col, row + 1);
int right = getMaxTrace(a, col + 1, row + 1);
res += Math.max(left, right);
}
return res;
}
getMaxTrace(a, 0, 0);
Заполнение массива а
реализовать самостоятельно
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
ЗдравствуйтеПишу android-приложение в учебных целях
Доброго времени сутокПодскажите примерный план решение следующей задачи: Захар очень любит двоичные последовательности, особенно ему нравится...
Приветствую всех! Читаю у Брюса Эккеля про дженерики, попался в качестве примера такой код:
Собственно, есть необходимость шифровать базу данных, сейчас работает так - все данные в бд зашифрованы, но сейчас все на SQLLiteБыло решено перевести...