Давайте иметь поле (заданных размеров) маленьких квадратов со значением на каждом квадрате. С каждого квадрата можно перемещаться только на квадрат непосредственно ниже, или по диагонали слева или справа. Задача состоит в том, чтобы найти максимальное комбинированное значение путешествия по полю.Простая динамическая программа программирования
Например для ввода
1
6 5
3 1 7 4 2
2 1 3 1 1
1 2 2 1 8
2 2 1 5 3
2 1 4 4 4
5 2 7 5 1
вывод должен быть 32, но мой код выхода 20.
Мой подход был исчерпывающе попробовать все возможные маршруты через поле следующим образом:
y == last_row return value[x,y]
f(x,y)
y != last_row return value[x,y] + max(f(x-1,y+1),f(x,y+1),f(x+1,y+1))
Есть ли ошибка в моем подходе, в моем коде или в обоих случаях?
Код здесь:
#include <iostream>
#include <vector>
#include <limits>
using namespace std;
typedef int T;
T max(T x, T y, T z) {
if(x < y) {
if(y < z) return z;
else return y;
}
else {
if(y > z) return x;
else {
if(x > z) return x;
else return z;
}
}
}
//Finds the maximum amount of stones possibly gathered by following coordinates x,y
//The topmost left is (0,0), bottom right is (columns-1,rows-1)
T max_stones_found_following(T x, T y, vector< vector<T> > A) {
//Reached the last row?
if(y == A.size()-1) return A[x][y];
else {
T went_left, went_right, went_down;
if(x-1 >= 0) went_left = max_stones_found_following(x-1, y+1, A);
else went_left = numeric_limits<T>::min();
if(x+1 <= A[x].size()-1) went_right = max_stones_found_following(x+1, y+1, A);
else went_right = numeric_limits<T>::min();
went_down = max_stones_found_following(x, y+1, A);
return A[x][y] + max(went_left, went_right, went_down);
}
}
int main() {
//Initialization
T test_cases, rows, columns, stones_found, max_stones;
vector< vector<T> > A;
cin >> test_cases;
while(test_cases--) {
//Field input
cin >> rows >> columns;
for(int i = 0; i < rows; i++) {
vector<T> row;
for(int j = 0; j < columns; j++) {
T in;
cin >> in;
row.push_back(in);
}
A.push_back(row);
}
max_stones = 0;
stones_found = 0;
//Try starting at different positions in the first row
for(int i = 0; i < columns; i++) {
stones_found = max_stones_found_following(i, 0, A);
if(stones_found > max_stones) max_stones = stones_found;
}
//Output
cout << max_stones << endl;
}
return 0;
}
Это не выглядит, как ваше решение использует динамическое программирование. –
Где находится «динамическая» часть этого упражнения? Я вижу typedef 'T' и никаких шаблонов вообще (за исключением использования вектора вектора). Скажите своему инструктору, что их определение «динамическое» ... нет. – WhozCraig
@WhozCraig: «Динамическое программирование» - это тема в системной инженерии и не имеет ничего общего с динамическим набором или динамическим управлением памятью. Я определенно не буду использовать шаблоны, отличные от 'vector', чтобы решить эту проблему. –