Code Forces 711C Coloring Trees
C. Coloring Trees
2 seconds
256 megabytes
standard input
standard output
ZS the Coder and Chris the Baboon has arrived at Udayland! They walked in the park where n trees grow. They decided to be naughty and color the trees in the park. The trees are numbered with integers from 1 to n from left to right.
Initially, tree i has color ci. ZS the Coder and Chris the Baboon recognizes only m different colors, so 0 ≤ ci ≤ m, where ci = 0 means that tree i is uncolored.
ZS the Coder and Chris the Baboon decides to color only the uncolored trees, i.e. the trees with ci = 0. They can color each of them them in any of the m colors from 1 to m. Coloring the i-th tree with color j requires exactly pi, j litres of paint.
The two friends define the beauty of a coloring of the trees as the minimum number of contiguous groups (each group contains some subsegment of trees) you can split all the n trees into so that each group contains trees of the same color. For example, if the colors of the trees from left to right are 2, 1, 1, 1, 3, 2, 2, 3, 1, 3, the beauty of the coloring is 7, since we can partition the trees into 7 contiguous groups of the same color : {2}, {1, 1, 1}, {3}, {2, 2}, {3}, {1}, {3}.
ZS the Coder and Chris the Baboon wants to color all uncolored trees so that the beauty of the coloring is exactly k. They need your help to determine the minimum amount of paint (in litres) needed to finish the job.
Please note that the friends can't color the trees that are already colored.
The first line contains three integers, n, m and k (1 ≤ k ≤ n ≤ 100, 1 ≤ m ≤ 100) — the number of trees, number of colors and beauty of the resulting coloring respectively.
The second line contains n integers c1, c2, ..., cn (0 ≤ ci ≤ m), the initial colors of the trees. ci equals to 0 if the tree number i is uncolored, otherwise the i-th tree has color ci.
Then n lines follow. Each of them contains m integers. The j-th number on the i-th of them line denotes pi, j (1 ≤ pi, j ≤ 109) — the amount of litres the friends need to color i-th tree with color j. pi, j's are specified even for the initially colored trees, but such trees still can't be colored.
Print a single integer, the minimum amount of paint needed to color the trees. If there are no valid tree colorings of beauty k, print - 1.
3 2 2
0 0 0
1 2
3 4
5 6
10
3 2 2
2 1 2
1 3
2 4
3 5
-1
3 2 2
2 0 0
1 3
2 4
3 5
5
3 2 3
2 1 2
1 3
2 4
3 5
0
In the first sample case, coloring the trees with colors 2, 1, 1 minimizes the amount of paint used, which equals to 2 + 3 + 5 = 10. Note that 1, 1, 1 would not be valid because the beauty of such coloring equals to 1 ({1, 1, 1} is a way to group the trees into a single group of the same color).
In the second sample case, all the trees are colored, but the beauty of the coloring is 3, so there is no valid coloring, and the answer is - 1.
In the last sample case, all the trees are colored and the beauty of the coloring matches k, so no paint is used and the answer is 0.
题意:给定N棵树,每棵树都有不同的颜色0-n,0代表没有涂色。如果这棵树没有颜色,那么你可以给他上色,如果已经有颜色,那你不能进行任何操作。接着给定一个数K,K代表着一排树的颜色有多少个相同的连续段。最后,给定每棵 树染上每种颜色的花费,求满足K的最小花费?
思路:比较明显的dp,但是当时并不会做,后来问了ZK大佬,才习得姿势,dp一直都不会,慢慢积累。
首先dp[i][j][k]代表,前i棵树的最后一棵树涂第j种颜色,并且涂成k个相同连续段的最小花费。首先初始状态dp[0][0][0]=0,然后分两种情况走。
1.color[i+1]!=0时,那么有2种情况:当前的j==color[i+1]时,dp[i+1][color[i+1]][k]=min(dp[i+1][color[i+1]][k],dp[i][j][k]),
当前的j!=color[i+1]时,dp[i+1][color[i+1]][k+1]=min(dp[i+1][color[i+1]][k+1],dp[i][j][k])。
2.color[i+1]==0时,那这棵树有1-p(m种)颜色可以选择,所以当p==j时,dp[i+1][p][k]=min(dp[i][j][k]+val[i+1][p],dp[i+1][p][k]),
当p!=j时,dp[i+1][p][k+1]=min(dp[i][j][k]+val[i+1][p],dp[i+1][p][k+1])。
代码如下:
#include <iostream>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <map>
#include <set>
#include <bitset>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <string>
#include <sstream>
#define lson l,m,rt*2
#define rson m+1,r,rt*2+1
#define mod 1000000007
#define mt(A,B) memset(A,B,sizeof(A))
using namespace std;
typedef long long LL;
const int N=200000+10;
const LL INF=0x3f3f3f3f3f3f3f3fLL;
LL dp[105][105][105];
LL c[105],val[105][105],ans=INF;
int main()
{
#ifdef Local
freopen("data.txt","r",stdin);
#endif
int i,j,K,n,m,k;
cin>>n>>m>>K;
for(i=1;i<=n;i++)cin>>c[i];
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
cin>>val[i][j];
}
}
mt(dp,0x3f);
dp[0][0][0]=0;
for(i=0;i<n;i++){
for(j=0;j<=m;j++){
for(k=0;k<=i;k++){
if(dp[i][j][k]!=INF){
if(c[i+1]){
dp[i+1][c[i+1]][k+(c[i+1]!=j)]=min(dp[i+1][c[i+1]][k+(c[i+1]!=j)],dp[i][j][k]);
}
else{
for(int p=1;p<=m;p++){
dp[i+1][p][k+(p!=j)]=min(dp[i][j][k]+val[i+1][p],dp[i+1][p][k+(p!=j)]);
}
}
}
}
}
}
for(i=1;i<=m;i++)
{
ans=min(dp[n][i][K],ans);
}
if(ans==INF)cout<<-1<<endl;
else cout<<ans<<endl; }
Code Forces 711C Coloring Trees的更多相关文章
- codeforces 711C Coloring Trees(DP)
题目链接:http://codeforces.com/problemset/problem/711/C O(n^4)的复杂度,以为会超时的 思路:dp[i][j][k]表示第i棵数用颜色k涂完后bea ...
- CodeForces 711C Coloring Trees (DP)
题意:给定n棵树,其中有一些已经涂了颜色,然后让你把没有涂色的树涂色使得所有的树能够恰好分成k组,让你求最少的花费是多少. 析:这是一个DP题,dp[i][j][k]表示第 i 棵树涂第 j 种颜色恰 ...
- 【动态规划】Codeforces 711C Coloring Trees
题目链接: http://codeforces.com/problemset/problem/711/C 题目大意: 给N棵树,M种颜色,已经有颜色的不能涂色,没颜色为0,可以涂色,每棵树I涂成颜色J ...
- CodeForces 711C Coloring Trees
简单$dp$. $dp[i][j][k]$表示:前$i$个位置染完色,第$i$个位置染的是$j$这种颜色,前$i$个位置分成了$k$组的最小花费.总复杂度$O({n^4})$. #pragma com ...
- Coloring Trees CodeForces - 711C
Coloring Trees CodeForces - 711C 题意:有n个点,每个点有一个c值,如果为0表示它没有被染色,否则表示它被染成了c值的颜色.颜色有1到m.把第i棵树染成颜色j所需要的代 ...
- codeforces 711C C. Coloring Trees(dp)
题目链接: C. Coloring Trees time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- Codeforces Round #369 (Div. 2) C. Coloring Trees(dp)
Coloring Trees Problem Description: ZS the Coder and Chris the Baboon has arrived at Udayland! They ...
- 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 ...
- CodeForces #369 C. Coloring Trees DP
题目链接:C. Coloring Trees 题意:给出n棵树的颜色,有些树被染了,有些没有.现在让你把没被染色的树染色.使得beauty = k.问,最少使用的颜料是多少. K:连续的颜色为一组 ...
随机推荐
- 配置mybatis流程
使用mybatis的优点: 1. 易于上手和掌握. 2. sql写在xml里,便于统一管理和优化. 3. 解除sql与程序代码的耦合. 4. 提供映射标签,支持对象与数据库的orm字段关系映射 5. ...
- Entity Framework: 视图查询时重复返回第一行值, duplicate frst rows in resultset from a view
http://blog.csdn.net/riverlau/article/details/7476449 1. 使用rownumber给view加上一个标示列 SELECT ROW_NUMBER() ...
- 第 7 章 门面模式【Facade Pattern】
以下内容出自:<<24种设计模式介绍与6大设计原则>> 好,我们继续讲课.大家都是高智商的人,都写过纸质的信件吧,比如给女朋友写情书什么的,写信的过程大家都还记得吧,先写信的内 ...
- python is == 的区别
要点: is 判断是否是同一个对象.是通过id来判断的 == 是通过值来判断的 为了提高内存利用率对一些简单的对象,如一些数值较小的int对象,python采用重用对象内存的方法 例如指向 ...
- keybd_event函数用法
转自不用winio,直接达到驱动级模拟键盘效果的keybd_event函数用法 键盘模拟技术是在编写游戏外挂时经常使用的技术.但是由于很多游戏采用了directinput的方式,使得发送的一般键盘消息 ...
- 可恶的QT隐式共享
这个问题隐藏的很深,一般不容易察觉它造成的问题,而只是享受它提供的好处(节省内存,而且速度更快). 但我发现它现在至少造成两个问题: 1. 把大量的QString放到QMap里,使用完毕后清空QMap ...
- Windows.document对象
一.找到元素: docunment.getElementById("id"):根据id找,最多找一个:var a =docunment.getElementById("i ...
- nyist 61 传纸条 nyist 712 探 寻 宝 藏(双线程dp问题)
http://acm.nyist.net/JudgeOnline/problem.php?pid=61 http://acm.nyist.net/JudgeOnline/problem.php?pid ...
- 【HDOJ】2209 翻纸牌游戏
状态压缩+双向广搜.注意控制时间t. /* 2209 */ #include <iostream> #include <string> #include <map> ...
- index 辨别字符在字符串中的位置
namespace index{ class Program { static void Main(string[] args) { wh ...