Codeforces Round #369 (Div. 2)---C - Coloring Trees (很妙的DP题)
题目链接
http://codeforces.com/contest/711/problem/C
Description
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棵树,m种颜料,要求现在要给这些树涂上颜料,最后涂成k段(连续颜色相同划为一段如2, 1, 1, 1, 3, 2, 2, 3, 1, 3是7段),有些树已经涂了,则不涂了只能涂一次,输入n个数(每个数为0~m),0表示还没有涂,1~m表示已经涂了哪种颜料。接下来输入n行m列,表示每棵树涂成每种颜色所要的颜料量。现在要把所有树都涂上颜料涂成k段,求最少要用的颜料量;
思路:DP题,看到数据范围100,只能用3重循环解决问题(据说这题4重循环也能过~) dp[i][j][k] 表示从第一棵树开始涂,涂到第i棵树,有j段,且第i棵树涂的k种颜料所需要的最少颜料量,那么有状态转移方程dp[i][j][k]=min(my,dp[i-1][j][k])+cost[i][k]; my其实就是my=min( dp[i-1][j-1][非k] ); 最后min( dp[n][k][i] 1<=i<=m ) 就是答案;
代码如下:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#define eps 1e-8
#define maxn 105
#define inf 0x3f3f3f3f3f3f3f3f
#define IN freopen("in.txt","r",stdin);
using namespace std;
int c[];
long long cost[][];
long long dp[][][];
pair<long long,int> mfirst[][],msecond[][]; int main()
{
int n,m,s;
while(scanf("%d%d%d",&n,&m,&s)!=EOF)
{
for(int i=;i<=n;i++)
scanf("%d",&c[i]);
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
scanf("%I64d",&cost[i][j]);
if(c[i]) cost[i][c[i]]=;
} memset(dp,inf,sizeof(dp));
memset(mfirst,inf,sizeof(mfirst));
memset(msecond,inf,sizeof(msecond));
for(int i=;i<=m;i++)
dp[][][i]=;
mfirst[][]=make_pair(,-);
msecond[][]=make_pair(,-);
for(int i=;i<=n;i++)
{
for(int j=;j<=s&&j<=i;j++)
{
for(int k=;k<=m;k++)
{
if(c[i]&&c[i]!=k) continue;
long long my=mfirst[i-][j-].first;
if(mfirst[i-][j-].second==k) my=msecond[i-][j-].first; dp[i][j][k]=min(my,dp[i-][j][k])+cost[i][k];
if(dp[i][j][k]<mfirst[i][j].first){
msecond[i][j].first=mfirst[i][j].first;
mfirst[i][j].first=dp[i][j][k];
msecond[i][j].second=mfirst[i][j].second;
mfirst[i][j].second=k;
}
else if(dp[i][j][k]<msecond[i][j].first){
msecond[i][j].first=dp[i][j][k];
msecond[i][j].second=k;
}
}
}
}
long long ans=inf;
for(int i=;i<=m;i++)
ans=min(ans,dp[n][s][i]);
if(ans==inf)
puts("-1");
else
printf("%I64d\n",ans);
}
return ;
}
Codeforces Round #369 (Div. 2)---C - Coloring Trees (很妙的DP题)的更多相关文章
- 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 动态规划
C. Coloring Trees 题目连接: http://www.codeforces.com/contest/711/problem/C Description ZS the Coder and ...
- 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 Round #369 (Div. 2) C. Coloring Trees (DP)
C. Coloring Trees time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- Codeforces Round #369 (Div. 2) C. Coloring Trees(简单dp)
题目:https://codeforces.com/problemset/problem/711/C 题意:给你n,m,k,代表n个数的序列,有m种颜色可以涂,0代表未涂颜色,其他代表已经涂好了,连着 ...
- Codeforces Round #369 (Div. 2)-C Coloring Trees
题目大意:有n个点,由m种颜料,有些点没有涂色,有些点已经涂色了,告诉你每个点涂m种颜色的价格分别是多少, 让你求将这n个点分成k段最少需要多少钱. 思路:动态规划,我们另dp[ i ][ j ][ ...
- Codeforces #369 (Div. 2) C. Coloring Trees (3维dp
http://codeforces.com/group/1EzrFFyOc0/contest/711/problem/C https://blog.csdn.net/qq_36368339/artic ...
- Codeforces Round #369 (Div. 2) C 基本dp+暴力
C. Coloring Trees time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- Codeforces Round #396 (Div. 2) A B C D 水 trick dp 并查集
A. Mahmoud and Longest Uncommon Subsequence time limit per test 2 seconds memory limit per test 256 ...
随机推荐
- 8 步搭建 Node.js + MongoDB 项目的自动化持续集成
任何事情超过 90 秒就应该自动化,这是程序员的终极打开方式.Automating shapes smarter future. 这篇文章中,我们通过创建一个 Node.js + MongoDB 项目 ...
- c#设计模式-观察者模式
Observer 与 Subject 互为耦合,但是这种耦合的双方都依赖于抽象,而不依赖于具体. 一.观察者模式 目的 我们都知道解决一个问题有N种解决方式,但在面向对象的设计中如何能做到“高内聚,低 ...
- Eclipse中java向数据库中添加数据,更新数据,删除数据
前面详细写过如何连接数据库的具体操作,下面介绍向数据库中添加数据. 注意事项:如果参考下面代码,需要 改包名,数据库名,数据库账号,密码,和数据表(数据表里面的信息) package com.ning ...
- Android TextView 常用技巧
Android ListView 常用技巧 Android TextView 常用技巧 TextView在Android中实现文字说明等功能,基本的使用都很简单,那么除了基本展示文字的使用,我们还能够 ...
- Iframe去掉滚动条
<html><head><title></title></head><body STYLE='OVERFLOW:SCROLL;OVER ...
- Spring配置汇总
现在主流的JavaWeb应用几乎都会用到Spring,以下是Spring的配置,以及结合Web的SpringMVC配置的汇总. jar包的引入 与Web项目集成 Spring配置文件 SpringMV ...
- javascript中数组和字符串的方法比较
× 目录 [1]可索引 [2]转换 [3]拼接[4]创建[5]位置 前面的话 字符串和数组有很多的相同之处,它们的方法众多,且相似度很高:但它们又有不同之处,字符串是不可变值,于是可以把其看作只读的数 ...
- linux分享六:字符串处理
一:cut (1)其语法格式为:cut [-bn] [file] 或 cut [-c] [file] 或 cut [-df] [file] 使用说明cut 命令从文件的每一行剪切字节.字符和字段并将这 ...
- 解决Myeclipse下Debug出现Source not found以及sql server中导入数据报错
前言:在空间里回顾了我的2014,从生活.技术.家庭等各方面对自己进行总结剖析,也是给自己一个交代.也想在博客上专门写一篇2014年度菜鸟的技术路回忆录,但是因为各种事一再耽搁了,现在来写也就更显得不 ...
- android布局文件中android:icon="?attr/menuIconCamera"找不到对应图标路径
如 <item android:id="@+id/camera" android:title="Camera" android:icon="?a ...