StormFalcon32

Cowmbat

Dec 22nd, 2019
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.89 KB | None | 0 0
  1. import java.io.BufferedReader;
  2. import java.io.BufferedWriter;
  3. import java.io.FileReader;
  4. import java.io.FileWriter;
  5. import java.io.IOException;
  6. import java.io.PrintWriter;
  7. import java.util.Arrays;
  8. import java.util.StringTokenizer;
  9.  
  10. public class MoortalCowmbat {
  11.  
  12. public static void main(String[] args) throws IOException {
  13. // BufferedReader in = new BufferedReader(new
  14. // FileReader("D:\\Java\\USACO-Gold\\Gold\\MoortalCowmbat\\2.in"));
  15. BufferedReader in = new BufferedReader(new FileReader("cowmbat.in"));
  16. PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("cowmbat.out")));
  17. StringTokenizer tk = new StringTokenizer(in.readLine());
  18. int N = Integer.parseInt(tk.nextToken());
  19. int M = Integer.parseInt(tk.nextToken());
  20. int K = Integer.parseInt(tk.nextToken());
  21. char[] c = in.readLine().toCharArray();
  22. int[] s = new int[N];
  23. int[][] adjMat = new int[M][M];
  24. for (int i = 0; i < N; i++) {
  25. s[i] = (int) (c[i] - 'a');
  26. }
  27. for (int i = 0; i < M; i++) {
  28. tk = new StringTokenizer(in.readLine());
  29. for (int j = 0; j < M; j++) {
  30. adjMat[i][j] = Integer.parseInt(tk.nextToken());
  31. }
  32. }
  33. int[][] dists = new int[M][M];
  34. for (int i = 0; i < M; i++) {
  35. dists[i] = dijkstra(adjMat, i, M);
  36. }
  37.  
  38. int[][] dp = new int[N][M];
  39. int[][] numConsec = new int[N][M];
  40. for (int i = 0; i < M; i++) {
  41. dp[0][i] = dists[s[0]][i];
  42. numConsec[0][i] = 1;
  43. }
  44. for (int i = 1; i < N; i++) {
  45. for (int j = 0; j < M; j++) {
  46. dp[i][j] = Integer.MAX_VALUE;
  47. }
  48. }
  49. for (int i = 1; i < N; i++) {
  50. for (int j = 0; j < M; j++) {
  51. for (int k = 0; k < M; k++) {
  52. if ((numConsec[i - 1][k] < K || N - i < K) && j != k) {
  53. continue;
  54. }
  55. int toTry = dp[i - 1][k] + dists[s[i]][j];
  56. if (toTry < dp[i][j]) {
  57. dp[i][j] = toTry;
  58. if (j == k) {
  59. numConsec[i][j] = numConsec[i - 1][k] + 1;
  60. } else {
  61. numConsec[i][j] = 1;
  62. }
  63. } else if (toTry == dp[i][j]) {
  64. int newConsec = 0;
  65. if (j == k) {
  66. newConsec = numConsec[i - 1][k] + 1;
  67. } else {
  68. newConsec = 1;
  69. }
  70. numConsec[i][j] = Math.max(numConsec[i][j], newConsec);
  71. }
  72. }
  73. }
  74. }
  75. int ans = Integer.MAX_VALUE;
  76. for (int i = 0; i < M; i++) {
  77. ans = Math.min(ans, dp[N - 1][i]);
  78. }
  79. System.out.println(ans);
  80. out.close();
  81. in.close();
  82. }
  83.  
  84. static int[] dijkstra(int[][] adjMat, int root, int N) {
  85. int[] dists = new int[N];
  86. Arrays.fill(dists, Integer.MAX_VALUE);
  87. boolean[] inSet = new boolean[N];
  88. dists[root] = 0;
  89. for (int k = 0; k < N - 1; k++) {
  90. int smallest = -1;
  91. long min = Long.MAX_VALUE;
  92. for (int i = 0; i < N; i++) {
  93. if (!inSet[i] && dists[i] < min) {
  94. smallest = i;
  95. min = dists[i];
  96. }
  97. }
  98. inSet[smallest] = true;
  99. for (int v = 0; v < N; v++) {
  100. int distsThroughU = dists[smallest] + adjMat[smallest][v];
  101. if (!inSet[v]) {
  102. dists[v] = Math.min(dists[v], distsThroughU);
  103. }
  104. }
  105. }
  106. return dists;
  107. }
  108. }
Advertisement
Add Comment
Please, Sign In to add comment