fork download
  1. #include <iostream>
  2. #include <string>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <unordered_set>
  6. #include <set>
  7. #include <unordered_map>
  8. #include <map>
  9.  
  10. using namespace std;
  11.  
  12. int House[1001][3];
  13. int Memo[1001];
  14. int Color[1001];
  15.  
  16. int main()
  17. {
  18. ios::sync_with_stdio(false);
  19. cin.tie(NULL);
  20. cout.tie(NULL);
  21.  
  22. int N;
  23. cin >> N;
  24.  
  25. for (int i = 1; i <= N; ++i)
  26. {
  27. int R, G, B;
  28. cin >> R >> G >> B;
  29. House[i][0] = R;
  30. House[i][1] = G;
  31. House[i][2] = B;
  32. }
  33.  
  34. // Memo[1] = min(R, G, B)
  35. // Memo[2] = min(Memo[1]의 값 + Memo[1]의 색을 제외한 자신의 최솟값, 자신의 최솟값 + Memo[1]의 값을 제외한 House[1]의 나머지 색의 값)
  36.  
  37. Memo[1] = 10000000;
  38. for (int i = 0; i < 3; ++i)
  39. {
  40. if (Memo[1] > House[1][i])
  41. {
  42. Memo[1] = House[1][i];
  43. Color[1] = i;
  44. }
  45. }
  46.  
  47. Memo[1] = min(House[1][0], House[1][1]);
  48. Memo[1] = min(Memo[1], House[1][2]);
  49.  
  50. for (int i = 2; i <= N; ++i)
  51. {
  52. int CurrentMin = 10000000;
  53. int MinColor;
  54. Memo[i] = 10000000;
  55. for (int j = 0; j < 3; ++j)
  56. {
  57. if (Memo[i] > House[i][j] + Memo[i - 1] && Color[i - 1] != j)
  58. {
  59. Memo[i] = House[i][j] + Memo[i - 1];
  60. Color[i] = j;
  61. }
  62.  
  63. if (CurrentMin > House[i][j])
  64. {
  65. CurrentMin = House[i][j];
  66. MinColor = j;
  67. }
  68.  
  69. if (j != Color[i - 1])
  70. House[i][j] = House[i][j] + Memo[i - 1];
  71. else
  72. House[i][j] = 10000000;
  73. }
  74.  
  75. if (MinColor != Color[i])
  76. {
  77. for (int j = 0; j < 3; ++j)
  78. {
  79. if (Memo[i] > House[i - 1][j] + CurrentMin && MinColor != j)
  80. {
  81. Memo[i] = House[i - 1][j] + CurrentMin;
  82. Color[i - 1] = j;
  83. Color[i] = MinColor;
  84. }
  85. }
  86. }
  87. }
  88.  
  89. cout << Memo[N];
  90. }
Success #stdin #stdout 0.01s 5428KB
stdin
3
3 2 9
1 1 9
1 9 9
stdout
12