-
Notifications
You must be signed in to change notification settings - Fork 0
/
08_min_cost_path_tabulation.cpp
63 lines (56 loc) · 1.55 KB
/
08_min_cost_path_tabulation.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include<bits/stdc++.h>
using namespace std;
int min_cost_path(vector<vector<int>> &costs)
{
int dr = costs.size()-1;
int dc = costs[0].size()-1;
vector<vector<int>> min_cost(dr+1, vector<int>(dc+1));
vector<vector<string>> path(dr+1, vector<string>(dc+1));
for(int sr = dr ; sr>=0; sr--)
{
for(int sc = dc ; sc>=0; sc--)
{
if(sr==dr && sc==dc)
{
min_cost[sr][sc] = costs[sr][sc];
path[sr][sc] = ".";
}
else if(sr==dr)
{
min_cost[sr][sc] = costs[sr][sc] + min_cost[sr][sc+1];
path[sr][sc] = "h" + path[sr][sc+1];
}
else if(sc==dc)
{
min_cost[sr][sc] = costs[sr][sc] + min_cost[sr+1][sc];
path[sr][sc] = "v" + path[sr+1][sc];
}
else
{
if(costs[sr][sc+1] > costs[sr+1][sc])
{
min_cost[sr][sc] = costs[sr][sc] + min_cost[sr+1][sc];
path[sr][sc] = "v" + path[sr][sc+1];
}
else
{
min_cost[sr][sc] = costs[sr][sc] + min_cost[sr][sc+1];
path[sr][sc] = "h" + path[sr][sc+1];
}
}
}
}
cout<<path[0][0]<<endl;
return min_cost[0][0];
}
int main()
{
vector<vector<int>> costs =
{
{2,3,0,4},
{0,6,5,2},
{8,0,3,7},
{2,0,4,2}
};
cout<<min_cost_path(costs)<<endl;
}