Alex_tz307

USACO 2019 December Contest, Gold Problem 3. Moortal Cowmbat

Mar 31st, 2021
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.34 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define INF 0x3f3f3f3f
  3.  
  4. using namespace std;
  5.  
  6. ifstream fin("cowmbat.in");
  7. ofstream fout("cowmbat.out");
  8.  
  9. const int NMAX = 1e5 + 5;
  10. const int MAXM = 26;
  11. int N, M, K, cost[MAXM][MAXM], change[NMAX][MAXM], dp[NMAX][MAXM], best[NMAX];
  12. string s;
  13. /// dp[i][c] - costul minim astfel incat pe pozitia i am caracterul c(deci ultimele K caractere cunt c)
  14.  
  15. void min_self(int &a, int b) {
  16.   a = min(a, b);
  17. }
  18.  
  19. void solve() {
  20.   fin >> N >> M >> K >> s;
  21.   for (int i = 0; i < M; ++i)
  22.     for (int j = 0; j < M; ++j)
  23.       fin >> cost[i][j];
  24.   for (int k = 0; k < M; ++k)
  25.     for (int i = 0; i < M; ++i)
  26.       for (int j = 0; j < M; ++j)
  27.         min_self(cost[i][j], cost[i][k] + cost[k][j]);
  28.   for (int c = 0; c < M; ++c)
  29.     dp[0][c] = INF;
  30.   for (int i = 1; i <= N; ++i) {
  31.     best[i] = INF;
  32.     for (int c = 0; c < M; ++c) {
  33.       int cst = cost[s[i - 1] - 'a'][c];
  34.       change[i][c] = change[i - 1][c] + cst;
  35.       dp[i][c] = dp[i - 1][c] + cst; /// extind o secventa anterioara de lungime >= K
  36.       if (i >= K)
  37.         min_self(dp[i][c], best[i - K] + change[i][c] - change[i - K][c]); /// creez o secventa de lungime K
  38.       min_self(best[i], dp[i][c]);
  39.     }
  40.   }
  41.   fout << best[N] << '\n';
  42. }
  43.  
  44. void close_files() {
  45.   fin.close();
  46.   fout.close();
  47. }
  48.  
  49. int main() {
  50.   solve();
  51.   close_files();
  52.   return 0;
  53. }
  54.  
Add Comment
Please, Sign In to add comment