[关闭]
@Metralix 2017-04-22T16:24:12.000000Z 字数 675 阅读 723

D - Neighbor House

dp


题目大意

有n个房子,每个房子都可以染红绿蓝三种颜色,并且给出了每个房子染每种颜色费用,相邻房子不能同色,求染完房子的最小费用

解题思路

简单的DP。dp[i][j]就是第i个房子染第j个颜色后的总费用。
  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstring>
  4. using namespace std;
  5. const int N = 30;
  6. int mat[N][3];
  7. int dp[N][3];
  8. int n, cas = 1;
  9. void init() {
  10. scanf("%d", &n);
  11. for (int i = 0; i < n; i++)
  12. for (int j = 0; j < 3; j++)
  13. scanf("%d", &mat[i][j]);
  14. }
  15. void solve() {
  16. memset(dp, 0x3f, sizeof(dp));
  17. dp[0][0] = mat[0][0];
  18. dp[0][1] = mat[0][1];
  19. dp[0][2] = mat[0][2];
  20. for (int i = 1; i < n; i++)
  21. for (int j = 0; j < 3; j++)
  22. for (int k = 0; k < 3; k++)
  23. if (j != k) dp[i][j] = min(dp[i][j], dp[i - 1][k] + mat[i][j]);
  24. printf("Case %d: %d\n", cas++, min(min(dp[n - 1][0], dp[n - 1][1]), dp[n - 1][2]));
  25. }
  26. int main() {
  27. int test;
  28. scanf("%d", &test);
  29. while (test--) {
  30. init();
  31. solve();
  32. }
  33. return 0;
  34. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注