Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2016, 12:10   #1
ashvosk
 
Регистрация: 07.12.2016
Сообщений: 3
По умолчанию Двумерное динамическое программирование

opamagite reshit zadachu prashu ochen nado

дана A[n][m] матрица из натуральных чисел (2<=n,m<=100), и при прохождении (i,j) обьекта начисляется штраф A[i][j]. Наше задание попасть из любового элемента первой строчки в n-ную строчку. При этом из конкретного элемента можно продолжить движение к 3 соседним элементам нижней строчки.
Напишите программу которая выполнит данную задачу и минимизирует размер шрафа..
ashvosk на форуме Добавить отзыв для ashvosk Пожаловаться на это сообщение

(C++)
ashvosk вне форума Ответить с цитированием
Старый 08.12.2016, 12:15   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

http://www.programmersforum.ru/showthread.php?t=300954
p51x вне форума Ответить с цитированием
Старый 08.12.2016, 12:18   #3
ashvosk
 
Регистрация: 07.12.2016
Сообщений: 3
По умолчанию

ne obezatelno reshit za meya mojna dat bodskazku
ashvosk вне форума Ответить с цитированием
Старый 08.12.2016, 12:28   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

Так задача в лоб решается просто:
1. строим прямой путь от одного элемента до нужно, например, по прямой
2. https://en.wikipedia.org/wiki/Backtracking с параметром из предыдущего шага
3. по условию задачи отсекаем или добавляем решения
p51x вне форума Ответить с цитированием
Старый 08.12.2016, 12:48   #5
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Звучит-то как, - "Двумерное программирование".
Croessmah вне форума Ответить с цитированием
Старый 08.12.2016, 13:38   #6
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от ashvosk Посмотреть сообщение
mojna dat bodskazku
Даю бодсказку :

- это классически рекурсивная задача...
- для текущей позиции в цикле (по 3-м соседям) вызываете всё ту же функцию накопления штрафа...
- и суммируете значения штрафов...
- при этом где-то (в статической, глобальной переменной, дополнительном параметре функции...) храните минимально найденное до сих пор значение накопленного штрафа.
olej.tsil вне форума Ответить с цитированием
Старый 08.12.2016, 16:47   #7
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от olej.tsil Посмотреть сообщение
- это классически рекурсивная задача...
Интересно стало (задача).
У вас должно получиться что-то типа такого:
Код:
#include <vector> 
#include <iostream> 
using namespace std; 

typedef vector<vector<float>> matrix;

ostream& operator <<( ostream& out, vector<int>& v ) {
   out << "[ ";
   for( auto i = v.rbegin(); i < v.rend(); i++ ) cout << *i << " ";
   return out << "]";
} 

float min_trace( matrix& m, int y, int x, vector<int>& t ) {
   if( y == (int)m.size() - 1 ) {
      t.push_back( x );
      return m[ y ][ x ];
   }
   float mval = 1E99;
   vector<int> tvec;
   for( int ix = x - 1; ix <= x + 1; ix++ ) {
      if( ix < 0 ) continue;
      if( ix == (int)m[ y ].size() ) continue;
      vector<int> vec;
      float val = m[ y ][ x ] + min_trace( m, y + 1, ix, vec );
      if( val < mval ) {
         mval = val; 
         vec.push_back( x );
         t = vec;
      }
   }
   return mval; 
}

int main( void ) {
   matrix M = { 
      { 1, 2, 3, 4, 5, 4, 3, 2, 1 },
      { 2, 3, 4, 5, 4, 3, 2, 1, 0 },
      { 3, 4, 5, 4, 3, 2, 1, 0, 1 },
      { 4, 5, 4, 3, 2, 1, 0, 1, 2 }, 
   };
   cout << "матрица [ " << M.size() << "x" << M[ 0 ].size() << " ] :" << endl;
   for( auto &y : M ) {
      for( auto x : y ) cout << x << " ";
      cout << endl;
   }
   cout << "--------------------------------" << endl;   
   float mval = 1E99;      
   vector<int> tvec;
   for( int i = 0; i < (int)M[ 0 ].size(); i++ ) {
      vector<int> vec;
      float val = min_trace( M, 0, i, vec );
      if( val < mval ) {
         mval = val;
         tvec = vec;
      }   
   }
   cout << "минимальная трасса " << mval << " : ";
   cout << tvec << endl;
}
Это будет работать для матриц любой ширины и глубины:
Код:
$ ./straf 
матрица [ 4x9 ] :
1 2 3 4 5 4 3 2 1 
2 3 4 5 4 3 2 1 0 
3 4 5 4 3 2 1 0 1 
4 5 4 3 2 1 0 1 2 
--------------------------------
минимальная трасса 1 : [ 8 8 7 6 ]
olej.tsil вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двумерное динамическое программирование ashvosk Помощь студентам 0 07.12.2016 20:42
Динамическое программирование 4ubak01 Windows Forms 0 21.04.2016 21:22
Динамическое программирование Hyskills Общие вопросы по Java, Java SE, Kotlin 0 24.02.2016 21:34
динамическое программирование stefan0202 Паскаль, Turbo Pascal, PascalABC.NET 3 07.02.2011 22:05