class Solution
{
public:
int cost;
std::vector<int> citiesInOrder;
};
class SearchWrapper
{
public:
int startCity;
int mask;
};
std::vector<std::vector<int>> matrix;
std::map<SearchWrapper, Solution> solutionsMap;
Solution DynamicProgrammingSolver::solveRecursive(int mask, int startCity) {
Solution solution1;
if (mask == (1 << matrix.size()) - 1) {
solution1.citiesInOrder.push_back(startCity);
solution1.cost = matrix[startCity][0];
return solution1;
}
Solution solution2;
solution2.cost = INT_MAX;
for (int city = 0; city < matrix.size(); city++) {
if ((mask & (1 << city)) == 0) {
SearchWrapper searchWrapper;
searchWrapper.startCity = city;
searchWrapper.mask = mask | (1 << city);
Solution solutionFromMap = solutionsMap[searchWrapper];
Solution someSolution;
if (solutionFromMap.cost == 0) {
someSolution = solveRecursive(mask | (1 << city), city);
}
else {
someSolution = solutionFromMap;
}
Solution finalSolution;
finalSolution.cost = matrix[startCity][city] + someSolution.cost;
finalSolution.citiesInOrder.push_back(startCity);
finalSolution.citiesInOrder.insert(finalSolution.citiesInOrder.end(),
someSolution.citiesInOrder.begin(), someSolution.citiesInOrder.end());
if (solution2.cost > finalSolution.cost) {
solution2 = finalSolution;
}
SearchWrapper searchWrapperToInsert;
searchWrapperToInsert.startCity = city;
searchWrapperToInsert.mask = mask | (1 << city);
solutionsMap[searchWrapperToInsert] = finalSolution;
int x = 5;
}
}
return solution2;
}
wywołanie tej funkcji: solveRecursive(1,0);
{"html5":"htmlmixed","css":"css","javascript":"javascript","php":"php","python":"python","ruby":"ruby","lua":"text\/x-lua","bash":"text\/x-sh","go":"go","c":"text\/x-csrc","cpp":"text\/x-c++src","diff":"diff","latex":"stex","sql":"sql","xml":"xml","apl":"apl","asterisk":"asterisk","c_loadrunner":"text\/x-csrc","c_mac":"text\/x-csrc","coffeescript":"text\/x-coffeescript","csharp":"text\/x-csharp","d":"d","ecmascript":"javascript","erlang":"erlang","groovy":"text\/x-groovy","haskell":"text\/x-haskell","haxe":"text\/x-haxe","html4strict":"htmlmixed","java":"text\/x-java","java5":"text\/x-java","jquery":"javascript","mirc":"mirc","mysql":"sql","ocaml":"text\/x-ocaml","pascal":"text\/x-pascal","perl":"perl","perl6":"perl","plsql":"sql","properties":"text\/x-properties","q":"text\/x-q","scala":"scala","scheme":"text\/x-scheme","tcl":"text\/x-tcl","vb":"text\/x-vb","verilog":"text\/x-verilog","yaml":"text\/x-yaml","z80":"text\/x-z80"}