4-й этап Республиканской олимпиады по информатике 2021-2022, 2 тура
Задача D. Витя - черепашка ниндзя 2
Ограничение по времени:
1 секунда
Ограничение по памяти:
256 мегабайт
Дается прямоугольная таблица N×M, в каждой клетке записано какое-то число. Витя находится в левой верхней клетке, его цель добраться до правого нижнего угла. За один ход ему разрешается перемещаться в соседнюю клетку либо вправо, либо вниз (влево и вверх перемещаться запрещено). За посещение клетки, Витя должен платить число указанное в этой клетке. Дончик владелец таблицы. Он решил сделать скидку своему другу Вите, разрешив платить только за самые дорогие(наибольшие по значению) K клеток на его пути от левого верхнего угла в правый нижний. Какое минимальное количество денег потратит Витя для достижения своей цели?
Формат входного файла
В первой строке даны три целых числа N,M и K (1<=N,M<=500, 1<=K<=N+M−1).
В следующих N строках даны по M целых чисел — j-е число на i-й строке ai,j (0<=ai,j<=500) является числом на клетке в i-й строке и j-м столбце таблицы.
Формат выходного файла
Выведите одно целое число — ответ на задачу.
Примеры:
Вход 3 3 5 1 1 1 6 6 10 1 7 3Ответ
16Вход
4 4 2 1 3 2 6 7 4 5 2 1 4 6 7 1 0 1 0Ответ
8
Замечание
Комментарий/решение:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int MAXN = 1000;
int n, m, k;
int a[MAXN][MAXN];
int dp[MAXN][MAXN];
int main() {
cin >> n >> m >> k;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> a[i][j];
}
}
dp[0][0] = a[0][0];
for (int i = 1; i < n; i++) {
dp[i][0] = max(dp[i-1][0], a[i][0]);
}
for (int j = 1; j < m; j++) {
dp[0][j] = max(dp[0][j-1], a[0][j]);
}
for (int i = 1; i < n; i++) {
for (int j = 1; j < m; j++) {
dp[i][j] = a[i][j] + max(dp[i-1][j], dp[i][j-1]);
}
}
cout << dp[n-1][m-1] - k << endl;
return 0;
}
Возможно, что при неправильном наборе формул, они будут
доредактированы модератором. При этом содержание не будет меняться.