题目链接:C. Coloring Trees

题意:给出n棵树的颜色,有些树被染了,有些没有。现在让你把没被染色的树染色。使得beauty = k。问,最少使用的颜料是多少。

     K:连续的颜色为一组,一共有多少组。

颜料用量:p[i][j]表示第i棵树用颜料j染色 需要p[i][j]颜料。

思路:DP.

   dp方程:dp[i][j][k] = a 表示前i棵树beauty = j,且第j棵树染色为k时,需要的最少颜料为a。

状态转移:初始化第一棵树dp[1][1][col[1]or(1~m)].

遍历剩下的2~n棵树i,beauty = j (1~min(k, i))时,如果已经被染色了,直接更新dp[i][j or (j+1)][col[i]]为min(dp[i-1][j][1~m])。

如果没被染色,尝试染第kkk(1~m)种颜色,并更新dp[i][j or (j+1)][kkk]为min(dp[i-1][j][kk]) (1<=kk<=m, 1<=KKK<=m)。

喜欢这个题。

#include <stdio.h>
#include <string.h>
#include <iostream>
#define maxn 210
#define inf 1e16
#define LL long long
using namespace std; int col[maxn];
int p[maxn][maxn];
LL dp[maxn][maxn][maxn]; int main() {
int n, m, k;
// freopen("in.cpp", "r", stdin);
while(~scanf("%d%d%d", &n, &m, &k)) {
//input
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("%I64d", &p[i][j]);
}
} //init
for (int i=1; i<=n; ++i) {
for (int j=1; j<=k; ++j) {
for (int kk=1; kk<=m; ++kk) {
dp[i][j][kk] = inf;
}
}
}
if (col[1]) dp[1][1][col[1]] = 0;
else {
for (int i=1; i<=m; ++i) {
dp[1][1][i] = p[1][i];
}
} //solve
for (int i=2; i<=n; ++i) { ///第i棵树
for (int j=1; j<=i && j<=k; ++j) { /// i-1 beauty=j
if (col[i]) { ///第i棵树颜色已经有了
for (int kk=1; kk<=m; ++kk) { ///
if (kk == col[i])
dp[i][j][col[i]] = min(dp[i][j][col[i]], dp[i-1][j][kk]);
else dp[i][j+1][col[i]] = min(dp[i][j+1][col[i]], dp[i-1][j][kk]);
}
} else {
for (int kk=1; kk<=m; ++kk) { ///i
for (int kkk=1; kkk<=m; ++kkk) { ///i-1
if (kk == kkk)
dp[i][j][kk] = min(dp[i][j][kk], dp[i-1][j][kkk]+p[i][kk]);
else dp[i][j+1][kk] = min(dp[i][j+1][kk], dp[i-1][j][kkk]+p[i][kk]);
}
}
}
}
} LL ans = inf;
for (int i=1; i<=m; ++i) {
ans = min(ans, dp[n][k][i]);
}
if (ans == inf) ans = -1;
printf("%I64d\n", ans);
}
return 0;
}

CodeForces #369 C. Coloring Trees DP的更多相关文章

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

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

  2. Codeforces 711 C. Coloring Trees (dp)

    题目链接:http://codeforces.com/problemset/problem/711/C 给你n棵树,m种颜色,k是指定最后的完美值.接下来一行n个数 表示1~n树原本的颜色,0的话就是 ...

  3. 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 ...

  4. Codeforces 677C. Coloring Trees dp

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

  5. C. Coloring Trees DP

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

  6. Codeforces 1027E Inverse Coloring 【DP】

    Codeforces 1027E Inverse Coloring 题目链接 #include<bits/stdc++.h> using namespace std; #define N ...

  7. CodeForces 711C Coloring Trees (DP)

    题意:给定n棵树,其中有一些已经涂了颜色,然后让你把没有涂色的树涂色使得所有的树能够恰好分成k组,让你求最少的花费是多少. 析:这是一个DP题,dp[i][j][k]表示第 i 棵树涂第 j 种颜色恰 ...

  8. Codeforces 596D Wilbur and Trees dp (看题解)

    一直在考虑, 每一段的贡献, 没想到这个东西能直接dp..因为所有的h都是一样的. #include<bits/stdc++.h> #define LL long long #define ...

  9. 【Codeforces 711C】Coloring Trees

    [链接] 我是链接,点我呀:) [题意] 连续相同的数字分为一段 你可以改变其中0为1~m中的某个数字(改变成不同数字需要不同花费) 问你最后如果要求分成恰好k段的话,最少需要多少花费 [题解] dp ...

随机推荐

  1. Oracle权限和数据类型

    oracle创建用户: CREATE USER 用户名 IDENTIFIED BY 口令 [ACCOUNT LOCK|UNLOCK] [注]LOCK|UNLOCK创建用户时是否锁定,默认为锁定状态.锁 ...

  2. C/C++ 结构体 函数传递

    #include <stdio.h> #include <stdlib.h> struct student{ int num; ]; double dec; }; void s ...

  3. Ubuntu 安装BCM 43142无线网卡驱动

    ubuntu14.04 安装 bcm43142无线网卡 用命令lspci 查看无线网卡类型 然后下载对应的无线网卡驱动. 之后,使用下列命令安装,即可搜索无线热点了: sudo apt-get ins ...

  4. bzoj1977 [BeiJing2010组队]次小生成树 Tree

    和倍增法求lca差不多,维护每个点往上跳2^i步能到达的点,以及之间的边的最大值和次大值,先求出最小生成树,对于每个非树边枚举其端点在树上的路径的最大值,如果最大值和非树边权值一样则找次大值,然后维护 ...

  5. oracle分层查询中的start with和connect by(树结构查询)

    来源:  http://blog.csdn.net/itmyhome1990/article/details/16338637   ORACLE是一个关系数据库管理系统,它用表的形式组织数据,在某些表 ...

  6. android studio 引入第三方类库jar包

    第三方类库jar包 这就简单多了,直接将jar包拷贝到app/libs下,然后在app下的build.gradle中添加此jar的依赖.如下: dependencies { compile 'com. ...

  7. .NET开发实战1-军队未出,粮草先行。

    马上期末考试了,会想起这个学习的自己.一直都在一个人搞java的研究,C#课也没怎么去上.所以在这里想弥补一下自己没去上课的原因,也希望老师能够理解这个还在迷茫的我. 正所谓,军队未出粮草先行,所以我 ...

  8. pb数据窗口设置操作

    1 使DataWindow列只能追加不能修改如何使DataWindow中的数据只能追加新记录而不能修改,利用 Column 的 Protect 属性可以很方便的做到这一点,方法如下:将每一列的 Pro ...

  9. Scala正则和抽取器:解析方法参数

    在<正则表达式基础知识>中概括了正则表达式的基础知识, 本文讲解如何使用正则表达式解析方法参数,从而可以根据 DAO 自动生成 Service. 在做 Java 项目时,常常要根据 DAO ...

  10. 嵌入式Linux内核制作【转】

    本文转载自:http://blog.csdn.net/coding__madman/article/details/51291316 1. Linux体系结构 从整体上来分,linux可以分为User ...