#include
#include //лень писать функцию min как макрос
#include
using namespace std;
int main()
{
size_t SizeN, SizeM; //размеры массива
cin >> SizeN >> SizeM;
size_t N = SizeM, Nmin1 = 0ULL; //начала строк (чтобы не перемножать в цикле)
vector MatrixNM(SizeN*SizeM); //одномерный массив [строка][столбец] => [строка*кол-во столбцов + столбец]
for (auto& i : MatrixNM) cin >> i;
for (size_t i = 1; i < SizeM; i++) MatrixNM[i] += MatrixNM[i - 1]; //Вычисление 0 строки
for (size_t i = 1; i < SizeN; i++) //Вычисление от 1 до последней строки
{
MatrixNM[N] += MatrixNM[Nmin1]; //Вычисление нулевого столбца в i-й строке
for (size_t j = 1; j < SizeM; j++) //Вычисление столбцов > 0 в i-й строке
{
MatrixNM[N + j] += min(MatrixNM[Nmin1 + j], MatrixNM[N + j - 1]);
}
N += SizeM; Nmin1 += SizeM; //вычисление начала i-й и (i-1)-й строки
}
cout << MatrixNM.back(); //Вывод последнего элемента как результата.
}
? * M
N×M записано некоторое число. Изначально игрок находится в левой верхней клетке. За один ход ему разрешается перемещаться в соседнюю клетку либо вправо, либо вниз (влево и вверх перемещаться запрещено). При проходе через клетку с игрока берут столько килограммов еды, какое число записано в этой клетке (еду берут также за первую и последнюю клетки его пути).
Требуется найти минимальный вес еды в килограммах, отдав которую игрок может попасть в правый нижний угол.
Формат ввода
Вводятся два числа N и M — размеры таблицы (
1
≤
?
≤
20
1≤N≤20,
1
≤
?
≤
20
1≤M≤20). Затем идет N строк по M чисел в каждой — размеры штрафов в килограммах за прохождение через соответствующие клетки (числа от 0 до 100).
Формат вывода
Выведите минимальный вес еды в килограммах, отдав которую можно попасть в правый нижний угол.
5 5
1 1 1 1 1
3 100 100 100 100
1 1 1 1 1
2 2 2 2 1
1 1 1 1 1
вывод 11