原题地址: https://codeforces.com/problemset/problem/711/C

题意:有nnn棵树,mmm种颜色,让你分成kkk段,数字000代表该树没没有进行染色,需要你从mmm种颜色中选择一个为其染色,染色的过程中需要消耗代价,求最小代价(已有颜色不必再染色)

思路:三维dpdpdp,定义状态dp[i][j][k]dp[i][j][k]dp[i][j][k]表示前iii个树,分成jjj段,最后颜色是kkk的方案数。

需要注意的是初始化,对第一棵树是否有颜色分类讨论即可。

#include <bits/stdc++.h>
#define eps 1e-8
#define PI acos(-1)
#define lson l,mid,rt<<1
#define rson mid+1,r,(rt<<1)+1
#define CLR(x,y) memset((x),y,sizeof(x))
#define fuck(x) cerr << #x << "=" << x << endl
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int seed = 131;
const ll INF = 0x3f3f3f3f3f3f;
const int maxn = 1e5 + 5;
const int mod = 1e9 + 7;
int col[maxn];
int a[105][105];
ll dp[105][104][105];//dp[i][j][k]表示前i个,分成j段,最后颜色是k的方案数
int n, m, K;
int main() {scanf("%d%d%d", &n, &m, &K);//树,颜色数,段for (int i = 1; i <= n; i++) {scanf("%d", &col[i]);}for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {scanf("%d", &a[i][j]);}}CLR(dp, INF);fuck(dp[1][1][1]);if (col[1]) {dp[1][1][col[1]] = 0;} else {for (int i = 1; i <= m; i++) {dp[1][1][i] = a[1][i];}}for (int i = 2; i <= n; i++) {for (int j = 1; j <= K; j++) {if (col[i]) {//有颜色for (int k = 1; k <= m; k++) {if (col[i] == k) {dp[i][j][col[i]] = min(dp[i][j][col[i]], dp[i - 1][j][col[i]]);} else {dp[i][j][col[i]] = min(dp[i][j][col[i]], dp[i - 1][j - 1][k]);}}} else {//没有颜色for (int k = 1; k <= m; k++) {for (int p = 1; p <= m; p++) {if (k == p)dp[i][j][k] = min(dp[i][j][k], dp[i - 1][j][k] + a[i][k]);else dp[i][j][k] = min(dp[i][j][k], dp[i - 1][j - 1][p] + a[i][k]);}}}}}ll ans = INF;for (int i = 1; i <= m; i++) {ans = min(ans, dp[n][K][i]);}if (ans == INF) printf("-1\n");else printf("%lld\n", ans);return 0;
}

CF 711C Coloring Trees(三维dp)相关推荐

  1. CodeForces 711C Coloring Trees (三维DP)

    题目链接:http://codeforces.com/problemset/problem/711/C DP #include<bits/stdc++.h> using namespace ...

  2. CodeForces 711C.Coloring Trees【DP】

    看上去就是DP的一个题,由于自己太菜了,还是不会做 先给个提交的地方:cf 711C 这个题看到数据,很明显是dp,因为n,m,k的值都不大,我们可以建立矩阵来推理 很明显答案跟dp[n][k]有关 ...

  3. codeforces 711C Coloring Trees(DP)

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

  4. CodeForces 711C - Coloring Trees DP

    /*http://codeforces.com/problemset/problem/711/C http://codeforces.com/blog/entry/46830官方题解:We compu ...

  5. 【CF 149D】Coloring Brackets(dp)

    [CF 149D]Coloring Brackets(dp) D. Coloring Brackets time limit per test 2 seconds memory limit per t ...

  6. CF#764(div.3A~D)dp进阶

    CF#764(div.3A~D)&&dp进阶 CF#764(div.3) Problem - A - Codeforces 题意 一个数列,每次操作可以使这个数列中的任何数加1,问最少 ...

  7. VOJ - Did he drop any good loot? (三维DP)

    Did he drop any good loot? 题目链接:A - Did he drop any good loot? Gym - 100694A 题意 n种物品,每种物品有价值p[i].重量w ...

  8. 【状态dp】poj 1185 炮兵阵地(三维dp)

    poj 1185 炮兵阵地 http://poj.org/problem?id=1185 问题描述:给你一个n行m列的P-H矩阵,H表示不能安置炮兵,1可以安置炮兵,要求炮兵攻击管辖内不能在安置其他炮 ...

  9. dp专题-cf 711c

    cf 711 c 题意:给出n颗树,初始有颜色,现在要涂颜色,只能对没有涂颜色的树上色,一棵树涂颜色有代价,现在要求,涂完颜色后,把n颗树划分成k个连续区间,每一个划分定义为相同颜色的连续区间,求k个 ...

最新文章

  1. C#中的{n}运算符
  2. man命令手册打开以后的使用方法
  3. SharePoint里如何设置People picker值为当前登录用户值
  4. 寒假作业3:抓老鼠啊~亏了还是赚了?
  5. 1至100之和用c语言表达方式,C语言菜鸟基础教程之求1到100的和
  6. nagios的check_tcp,check_udp插件的使用文档
  7. 绥化二中高考成绩查询2021,2014绥化中考
  8. 【洛谷P1314】聪明的质检员(二分+前缀和+差分)
  9. PHP验证码代码_php验证码类
  10. 【NLP_命名实体识别】Albert+BiLSTM+CRF模型训练、评估与使用
  11. kindle索引_Kindle 有哪些鲜为人知的使用技巧?
  12. 执着女股民:20年炒一只股票 翻几十倍很轻松
  13. linux分区修复命令,在Linux下成功修复分区表出错
  14. Jenkins(03):配置Jenkins自动发送邮件
  15. Excel中DATEDIF函数的使用方法基础篇
  16. 【Ubuntu touch for xiaomi 8】小米8第三方ROM
  17. c语言输出矩形及对角线,[新]C语言期末复习,经典练习题+知识点总结+模拟考题 三位一体,完胜c语言!!!!考期必备神器...
  18. 【经验分享】调试STM32F107VC单片机驱动DP83848以太网PHY芯片时遇到的问题
  19. 悦轩饼家-商品列表样式
  20. 【系统运维-Linux】使用U盘安装Linux

热门文章

  1. delphi控件切图界面闪烁_8、控件系列之_加载占位图+页面指示器
  2. php调用mahout包,mahout实现基于用户的Mahout推荐程序
  3. java float类型是否为空_java – 如何使float类型的变量为null
  4. 管道仪表流程图中常用的字母及其含义
  5. i5功耗最低的cpu_CPU真的很费电? 三种环境下处理器功耗实测
  6. C Programming学习笔记【谭浩强老师编】(第四章选择结构程序设计)02 逻辑运算符和逻辑表达式
  7. VS Nuget的使用
  8. 电口以太网物理层一致性测试原理与过程
  9. 有关likely和unlikely
  10. 读书笔记—别让情绪毁了你(插图精读本)