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

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

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

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

代码如下:

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <set>
#include <queue>
#include <algorithm>
#include <vector>
#include <map>
#include <cctype>
#include <cmath>
#include <stack>
#include <list>
#include <sstream>
#define freopenr freopen("in.txt", "r", stdin)
#define freopenw freopen("out.txt", "w", stdout)
using namespace std; typedef long long LL;
typedef pair<int, int> P;
const int INF = 0x3f3f3f3f;
const double inf = 0x3f3f3f3f3f3f;
const LL LNF = 0x3f3f3f3f3f3f3f;
const double PI = acos(-1.0);
const double eps = 1e-8;
const int maxn = 1e2 + 5;
const int mod = 1e9 + 7;
const int dr[] = {-1, 1, 0, 0, 1, 1, -1, -1};
const int dc[] = {0, 0, 1, -1, 1, -1, 1, -1};
const char *de[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
int n, m;
const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
inline int Min(int a, int b){ return a < b ? a : b; }
inline int Max(int a, int b){ return a > b ? a : b; }
inline LL Min(LL a, LL b){ return a < b ? a : b; }
inline LL Max(LL a, LL b){ return a > b ? a : b; }
inline bool is_in(int r, int c){
return r >= 0 && r < n && c >= 0 && c < m;
}
LL cor[maxn], w[maxn][maxn];
LL dp[maxn][maxn][maxn]; int main(){
int K;
while(scanf("%d %d %d", &n, &m, &K) == 3){
for(int i = 1; i <= n; ++i) scanf("%I64d", &cor[i]);
for(int i = 1; i <= n; ++i) for(int j = 1; j <= m; ++j) scanf("%I64d", &w[i][j]); for(int i = 0; i <= n; ++i) for(int j = 0; j <= m; ++j)
for(int k = 0; k <= K; ++k) dp[i][j][k] = LNF; dp[0][0][0] = 0;
for(int i = 1; i <= n; ++i){
if(cor[i]){
for(int k = 1; k <= K; ++k){
dp[i][cor[i]][k] = Min(dp[i][cor[i]][k], dp[i-1][cor[i]][k]);
for(int j = 0; j <= m; ++j){
if(j != cor[i]) dp[i][cor[i]][k] = Min(dp[i][cor[i]][k], dp[i-1][j][k-1]);
}
}
}
else{
for(int k = 1; k <= K; ++k){
for(int j = 1; j <= m; ++j){
dp[i][j][k] = Min(dp[i][j][k], dp[i-1][j][k] + w[i][j]);
for(int l = 0; l <= m; ++l){
if(l != j) dp[i][j][k] = Min(dp[i][j][k], dp[i-1][l][k-1] + w[i][j]);
}
}
}
}
}
LL ans = LNF;
for(int i = 1; i <= m; ++i) ans = Min(ans, dp[n][i][K]);
if(ans == LNF) ans = -1;
cout << ans << endl;
}
return 0;
}

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. 解决iis出现这个问题-2147467259 (0x80004005)

    在运行中运行下面命令就可解决问题 regsvr32 vbscript.dllregsvr32 jscript.dllregsvr32 %windir%\system32\inetsrv\asp.dll

  2. blocked because of many connection errors; unblock with 'mysqladmin flush-hosts;MySQL在远程访问时非常慢的解决方法;MySql链接慢的解决方法

     一:服务器异常:Host 'xx.xxx.xx.xxx' is blocked because of many connection errors; unblock with 'mysqladmin ...

  3. 学会简单使用poi进行excel有关操作

    直接上代码: 官网上的抄的api例子: package com.test; import java.io.File; import java.io.FileInputStream; import ja ...

  4. 13行代碼開發出来的PHP框架[转]

    <?PHP /** PHP極簡框架 交流: QQ群: 223494678 http://7di.net 用法 http://URL http://URL/hello http://URL/sev ...

  5. maven整合s2sh截图

  6. (转)每天一个Linux命令(5): rm

    http://www.cnblogs.com/peida/archive/2012/10/26/2740521.html 昨天学习了创建文件和目录的命令mkdir ,今天学习一下linux中删除文件和 ...

  7. C#中的局部类

    什么是局部类型? C# 2.0 引入了局部类型的概念.局部类型允许我们将一个类.结构或接口分成几个部分,分别实现在几个不同的.cs文件中. 局部类型适用于以下情况: (1) 类型特别大,不宜放在一个文 ...

  8. 在Eclipse中用TODO标签管理任务

    在Eclipse中用TODO标签管理任务 Elipse为Java项目的时候,有一个很人性化的“任务管理”功能,利用这个功能可以方便地将项目中一些需要处理的任务记录下来.先来看看“任务管理”是怎么使用的 ...

  9. Introduction 引言

    The risk of software failure has never been greater. The estimated annual economic impact ranges fro ...

  10. Ansible的循环

    Ansible的循环 1.       前言 有可能在一个任务中,可能要做很多事情,例如创建多个用户,安装很多个包等,那么就有可能用到循环. 2.       标准循环 重复的任务可以用下面的方式: ...