CodeForces 711C.Coloring Trees【DP】

原创 2016年08月30日 01:03:50

题目链接

http://codeforces.com/problemset/problem/711/C

思路

设dp[i][x][l]代表涂完前i棵树,美丽值为x,最后一棵树的颜色为l的最小代价。
那么
for each 1<=c<=m
若第i棵树没颜色
dp[i][x+1][c]=min(dp[i][x+1][c],dp[i-1][x][l]+p[i][c]) , if c!=l
dp[i][x][c]=min(dp[i][x][c],dp[i-1][x][l]+p[i][c]), if c==l
否则
dp[i][x+1][a[i]]=min(dp[i][x+1][a[i]],dp[i-1][x][l]), if c!=l
dp[i][x][a[i]]=min(dp[i][x][a[i]],dp[i-1][x][l]), if c==l

一开始初始化为INF即可。

比赛的手抽时候把一个m打成了n,竟然还过了pretest,改了就过了,心痛啊。
果然还是要细心细心再细心。

AC代码

#include <bits/stdc++.h>
#include <cstring>
using namespace std;
typedef long long ll;
int a[200];

ll dp[110][110][110];
ll p[200][200];
const ll INF=0x3f3f3f3f3f3f3f3f;
int main()
{
    memset(dp,0x3f3f3f3f,sizeof(dp));
    int n,m,k;
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1 ; i<=n ; ++i)
    {
        scanf("%d",&a[i]);
    }
    for(int i=1 ; i<=n ; ++i)
    {
        for(int j=1 ; j<=m ; ++j)
        {
            scanf("%I64d",&p[i][j]);
        }
    }
    if(a[1])dp[1][1][a[1]]=0;
    else
    {
        for(int c=1 ; c<=m ; ++c)
        {
            dp[1][1][c]=p[1][c];
        }
    }
    for(int i=2 ; i<=n ; ++i)if(a[i]==0)
    {
        for(int x=1 ; x<i ; ++x)
        {
            for(int c=1 ; c<=m ; ++c)
            {
                for(int l=1 ; l<=m ; ++l)
                {
                    if(l!=c)dp[i][x+1][c]=min(dp[i][x+1][c],dp[i-1][x][l]+p[i][c]);
                    else dp[i][x][c]=min(dp[i][x][c],dp[i-1][x][l]+p[i][c]);
                }
            }
        }
    }
    else
    {
        for(int x=1 ; x<i ; ++x)
        {
            for(int l=1 ; l<=m ; ++l)
            {
                if(l!=a[i])dp[i][x+1][a[i]]=min(dp[i][x+1][a[i]],dp[i-1][x][l]);
                else dp[i][x][a[i]]=min(dp[i][x][a[i]],dp[i-1][x][l]);
            }
        }
    }
    ll ans=INF;
    for(int c=1 ; c<=m ; ++c)
    {
        ans=min(ans,dp[n][k][c]);
    }
    if(ans==INF)printf("-1\n");
    else printf("%I64d\n",ans);
    return 0;
}
版权声明:本文为博主原创文章,转载请务必注明出处。

【动态规划】Codeforces 711C Coloring Trees

题目链接:   http://codeforces.com/problemset/problem/711/C 题目大意:   给N棵树,M种颜色,已经有颜色的不能涂色,没颜色为0...
  • u010568270
  • u010568270
  • 2016年08月30日 14:52
  • 561

Codeforces711C 【DP】

题意: 有n个点,m种颜色,你要给n个点上没有颜色的点染色。每个点i对应染的颜色j有一个颜料消耗,p[i][j]是点i染成j颜色的花费,你必须保证有k段颜色的点,输出最少花费多少颜料。 还有一个就...
  • KEYboarderQQ
  • KEYboarderQQ
  • 2016年08月30日 00:26
  • 521

Codeforces 902 C.Hashing Trees 树的同构

题意 给定树高h(2–1e5),然后h+1个数(2e5)(总和
  • m0_37809890
  • m0_37809890
  • 2017年12月20日 18:39
  • 125

CodeForces - 902C Hashing Trees 构造

CodeForces - 902C Hashing Trees 构造 题意:给出一颗n层的树。以及从第0层开始给出每层的节点个数。求是否存在同构,若存在输出其中任意两种。 题解:可以发现若存在同构:...
  • weixin_36571742
  • weixin_36571742
  • 2017年12月20日 20:58
  • 133

codeforces 9D How many trees? (组合二叉树)

题目链接:http://vjudge.net/contest/view.action?cid=47681#problem/D
  • u013790563
  • u013790563
  • 2014年06月06日 15:05
  • 831

codeforces545E Paths and Trees

题目:给定一个连通无向图,求包含u的一棵树,满足树上任意一点到u的距离等于原图中到那个点的最短距离。如果有多种这样的树,找到总权值最小的树。 题解:如果u连了i再连到j,相比u直接连到j,如果都是最...
  • caoyi0905
  • caoyi0905
  • 2015年05月25日 17:46
  • 442

Codeforces Round #453 (Div. 2) C 题 Hashing Trees

传送门 // 题意: 给定一颗树的高度h, 在给定h+1个数字, 代表每一层上面的节点数, 问是否只有一颗树满足这个序列, 如果是输出perfect , 否则输出ambiguous,并任意给出两组满...
  • Anxdada
  • Anxdada
  • 2018年01月12日 14:45
  • 56

codeforces 9D How many trees?(DP,注意状态表示方法)

题目链接 分析:比较一下各种状态表示, ①dp[n][h] 若表示n个节点深度为h,则每次转移需要O(n*h^2),不够优;  ②若dp[n][h]表示n个节点深度大于等于h,转移时的条件是至少有一个...
  • u011276914
  • u011276914
  • 2013年12月03日 00:40
  • 771

CodeForces 545E Paths and Trees

题目大意: 给一张无向联通图,让你用最短路去生成一颗最小生成树,并输出用到的边的编号。 解题思路: 在spfa的时候就可以更新记录用到哪些边,在拥有多种最短路的时候,选择边权小的进行...
  • qq919017553
  • qq919017553
  • 2015年09月01日 22:46
  • 315

Codeforces Round #453 (Div. 2) C - Hashing Trees 构造

特殊同构树,, 根据规则,相邻的两层结点 同时大于一个结点就会有差异, 输出方案的时候 一种是把所有的结点放到上一层的一个结点上,,另一种是把一个拿出来放到上层的一个结点上,另外的放到上层...
  • xiang_6
  • xiang_6
  • 2017年12月20日 21:43
  • 106
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CodeForces 711C.Coloring Trees【DP】
举报原因:
原因补充:

(最多只允许输入30个字)