-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path2976.MinimumCostToConvertStringI.cpp
More file actions
65 lines (56 loc) · 1.84 KB
/
2976.MinimumCostToConvertStringI.cpp
File metadata and controls
65 lines (56 loc) · 1.84 KB
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
64
65
class Solution {
public:
int m_distanceToCharacter[26][26];
void floydWarshallAlgorithm(const vector<char>& original, const vector<char>& changed, const vector<int>& cost) {
// Initialize data.
const int extent = min(
sizeof(m_distanceToCharacter) / sizeof(*m_distanceToCharacter),
sizeof(*m_distanceToCharacter) / sizeof(**m_distanceToCharacter)
);
for (int i = 0; i < extent; i++) {
for (int j = 0; j < extent; j++)
m_distanceToCharacter[i][j] = 10e6 + 1;
m_distanceToCharacter[i][i] = 0;
}
// Add initial scores.
const int n = min(original.size(), changed.size());
for (int i = 0; i < n; i++) {
const int
row = original[i] - 'a',
col = changed[i] - 'a';
m_distanceToCharacter[row][col] = min(
m_distanceToCharacter[row][col],
cost[i]
);
}
// Minimize routes.
for (int i = 0; i < extent; i++)
for (int j = 0; j < extent; j++)
for (int k = 0; k < extent; k++)
if (m_distanceToCharacter[j][k] > (m_distanceToCharacter[i][k] + m_distanceToCharacter[j][i]))
// Minimize route.
m_distanceToCharacter[j][k] = m_distanceToCharacter[i][k] + m_distanceToCharacter[j][i];
}
long long minimumCost(const string& source, const string& target, const vector<char>& original, const vector<char>& changed, const vector<int>& cost) {
// Speed thingies.
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
// Setup cost table.
floydWarshallAlgorithm(original, changed, cost);
// Find minimum cost.
long long minimumCost = 0;
const int n = min(source.size(), target.size());
for (int i = 0; i < n; i++) {
const int
row = source[i] - 'a',
col = target[i] - 'a';
// Invalid path check.
if (m_distanceToCharacter[row][col] > 10e6)
return -1;
// Add to cost.
minimumCost += m_distanceToCharacter[row][col];
}
return minimumCost;
}
};