题意:给定n棵树,其中有一些已经涂了颜色,然后让你把没有涂色的树涂色使得所有的树能够恰好分成k组,让你求最少的花费是多少。

析:这是一个DP题,dp[i][j][k]表示第 i 棵树涂第 j 种颜色恰好分成 k 组,然后状态转移方程是什么呢?

如果第 i 棵已经涂了,那么要么和第 i-1 棵一组,要么不和第 i-1 棵一组。

如果第 i 棵没有涂,和上面差不多,就是加上要涂的费用,并且要选择最少的。

代码如下:

  1. #pragma comment(linker, "/STACK:1024000000,1024000000")
  2. #include <cstdio>
  3. #include <string>
  4. #include <cstdlib>
  5. #include <cmath>
  6. #include <iostream>
  7. #include <cstring>
  8. #include <set>
  9. #include <queue>
  10. #include <algorithm>
  11. #include <vector>
  12. #include <map>
  13. #include <cctype>
  14. #include <cmath>
  15. #include <stack>
  16. #include <list>
  17. #include <sstream>
  18. #define freopenr freopen("in.txt", "r", stdin)
  19. #define freopenw freopen("out.txt", "w", stdout)
  20. using namespace std;
  21.  
  22. typedef long long LL;
  23. typedef pair<int, int> P;
  24. const int INF = 0x3f3f3f3f;
  25. const double inf = 0x3f3f3f3f3f3f;
  26. const LL LNF = 0x3f3f3f3f3f3f3f;
  27. const double PI = acos(-1.0);
  28. const double eps = 1e-8;
  29. const int maxn = 1e2 + 5;
  30. const int mod = 1e9 + 7;
  31. const int dr[] = {-1, 1, 0, 0, 1, 1, -1, -1};
  32. const int dc[] = {0, 0, 1, -1, 1, -1, 1, -1};
  33. const char *de[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
  34. int n, m;
  35. const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  36. const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  37. inline int Min(int a, int b){ return a < b ? a : b; }
  38. inline int Max(int a, int b){ return a > b ? a : b; }
  39. inline LL Min(LL a, LL b){ return a < b ? a : b; }
  40. inline LL Max(LL a, LL b){ return a > b ? a : b; }
  41. inline bool is_in(int r, int c){
  42. return r >= 0 && r < n && c >= 0 && c < m;
  43. }
  44. LL cor[maxn], w[maxn][maxn];
  45. LL dp[maxn][maxn][maxn];
  46.  
  47. int main(){
  48. int K;
  49. while(scanf("%d %d %d", &n, &m, &K) == 3){
  50. for(int i = 1; i <= n; ++i) scanf("%I64d", &cor[i]);
  51. for(int i = 1; i <= n; ++i) for(int j = 1; j <= m; ++j) scanf("%I64d", &w[i][j]);
  52.  
  53. for(int i = 0; i <= n; ++i) for(int j = 0; j <= m; ++j)
  54. for(int k = 0; k <= K; ++k) dp[i][j][k] = LNF;
  55.  
  56. dp[0][0][0] = 0;
  57. for(int i = 1; i <= n; ++i){
  58. if(cor[i]){
  59. for(int k = 1; k <= K; ++k){
  60. dp[i][cor[i]][k] = Min(dp[i][cor[i]][k], dp[i-1][cor[i]][k]);
  61. for(int j = 0; j <= m; ++j){
  62. if(j != cor[i]) dp[i][cor[i]][k] = Min(dp[i][cor[i]][k], dp[i-1][j][k-1]);
  63. }
  64. }
  65. }
  66. else{
  67. for(int k = 1; k <= K; ++k){
  68. for(int j = 1; j <= m; ++j){
  69. dp[i][j][k] = Min(dp[i][j][k], dp[i-1][j][k] + w[i][j]);
  70. for(int l = 0; l <= m; ++l){
  71. if(l != j) dp[i][j][k] = Min(dp[i][j][k], dp[i-1][l][k-1] + w[i][j]);
  72. }
  73. }
  74. }
  75. }
  76. }
  77. LL ans = LNF;
  78. for(int i = 1; i <= m; ++i) ans = Min(ans, dp[n][i][K]);
  79. if(ans == LNF) ans = -1;
  80. cout << ans << endl;
  81. }
  82. return 0;
  83. }

CodeForces 711C Coloring Trees (DP)的更多相关文章

  1. Codeforces 677C. Coloring Trees dp

    C. Coloring Trees time limit per test:2 seconds memory limit per test:256 megabytes input:standard i ...

  2. codeforces 711C Coloring Trees(DP)

    题目链接:http://codeforces.com/problemset/problem/711/C O(n^4)的复杂度,以为会超时的 思路:dp[i][j][k]表示第i棵数用颜色k涂完后bea ...

  3. 【动态规划】Codeforces 711C Coloring Trees

    题目链接: http://codeforces.com/problemset/problem/711/C 题目大意: 给N棵树,M种颜色,已经有颜色的不能涂色,没颜色为0,可以涂色,每棵树I涂成颜色J ...

  4. CodeForces 711C Coloring Trees

    简单$dp$. $dp[i][j][k]$表示:前$i$个位置染完色,第$i$个位置染的是$j$这种颜色,前$i$个位置分成了$k$组的最小花费.总复杂度$O({n^4})$. #pragma com ...

  5. codeforces 711C C. Coloring Trees(dp)

    题目链接: C. Coloring Trees time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  6. Codeforces Round #369 (Div. 2) C. Coloring Trees DP

    C. Coloring Trees   ZS the Coder and Chris the Baboon has arrived at Udayland! They walked in the pa ...

  7. CodeForces #369 C. Coloring Trees DP

    题目链接:C. Coloring Trees 题意:给出n棵树的颜色,有些树被染了,有些没有.现在让你把没被染色的树染色.使得beauty = k.问,最少使用的颜料是多少.   K:连续的颜色为一组 ...

  8. C. Coloring Trees DP

    传送门:http://codeforces.com/problemset/problem/711/C 题目: C. Coloring Trees time limit per test 2 secon ...

  9. Code Forces 711C Coloring Trees

    C. Coloring Trees time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

随机推荐

  1. Linux setjmp longjmp

    /********************************************************************* * Linux setjmp longjmp * 说明: ...

  2. aspose.words复制插入同一word文档中的某个页面

    选择word模板 Document doc = new Document(Server.MapPath("~\\templet") + "\\" + name. ...

  3. RequireJS入门(一) 转

    RequireJS由James Burke创建,他也是AMD规范的创始人. RequireJS会让你以不同于往常的方式去写JavaScript.你将不再使用script标签在HTML中引入JS文件,以 ...

  4. [转]Linux read用法

    来源:http://www.cnblogs.com/iloveyoucc/archive/2012/04/16/2451328.html 1.基本读取 read命令接收标准输入(键盘)的输入,或其他文 ...

  5. 为什么Jquery对input file控件的onchange事件只生效一次

    今天在做jquery对input file控件的onchange事件进行监听,就一直只生效一次,不知道Jquery为什么对file控件没有做到每次改变触发onchange事件的效果,但是还是有好几种解 ...

  6. js闭包用法

    闭包 既保证了 内部函数的私有性 又可以向外公开 通过一个已有对象 向它注入属性 /** * 闭包 * 在函数中定义的函数,在外部使用 * 1.在函数内部定义的函数,在外部不能访问 */ functi ...

  7. Wireshark基本介绍及应用tcp

    wireshark介绍 wireshark的官方下载网站: http://www.wireshark.org/ wireshark是非常流行的网络封包分析软件,功能十分强大.可以截取各种网络封包,显示 ...

  8. MySql 5.6 慢查询

    网上都巨坑 最后在官网找到了开启方法 原来是配置文件改了 Updated example for 2015 MySQL 5.6: slow_query_log = 1slow_query_log_fi ...

  9. pybombs 安装

    参考:https://github.com/gnuradio/pybombs 先装:pip 然后: pip install PyBOMBS 更新源: pybombs recipes add gr-re ...

  10. linux下安装subversion出现libtool: link: only absolute run-paths are allowed

    configure时加上 --with-apache-libexecdir=/usr/local/apache