codeforces 711C - Coloring Trees

原创 2016年08月30日 22:09:47

题目链接

题意:
有n课树,存在m种颜色,希望能分成k段。
然后给出每棵树的初始颜色。
然后给出每棵树染成1~m颜色各自的花费
问最终变成k端花费最少是多少钱。
注意,初始有颜色的树不能染色

思路:
dp[105][105][105]; //前i个树,第i个树染成j这种颜色,构成k段的最小花费
遍历到第i课树,判断一下这棵树是否已经被染色。
* 如果已经被染色,那么花费等于上一棵树的花费
* 如果没有被染色,那么遍历该课树可以被染成的颜色(1~m),花费等于上一棵树的花费+染该棵树的花费

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define INF 0x3f3f3f3f3f3f3f3f
const int maxn=105;
LL dp[105][105][105];  //前i个树,第i个树染成j这种颜色,构成k段的最小花费
int c[105];  //最初树的颜色
int p[105][105];  //第i个树染成j颜色的花费
int main()
{
    int n,m,k;
    cin >> n >> m >> k;
    for (int i = 0; i < n; i++)
    {
        cin >> c[i];
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            cin >> p[i][j];
        }
    }
    memset(dp,INF,sizeof(dp)); //花费初始化为很大值
    //处理第一课树
    if (c[0])  //如果第一棵树有颜色
    {
        dp[0][c[0]][1] = 0;
    }
    else
    {
        for (int i = 1; i <= m; i++) dp[0][i][1] = p[0][i];
    }

    for (int i = 1; i < n; i++)  //到第i个树
    {
        if (!c[i])  //如果这棵树可以被染色
        {
            for (int j = 1; j <= m; j++)  //第i个树染成j这种颜色
            {
                for (int k = 1; k <= i + 1; k++)  //分成了k段
                {
                    for(int h = 1; h <= m; h++)  //前面那个树是h这种颜色
                    {
                        if (j == h)  //如果当前这棵树和前面那棵树染的颜色相同
                        {
                            dp[i][j][k] = min(dp[i][j][k], dp[i - 1][h][k] + p[i][j]);
                        }
                        else  //不同,段数 + 1
                        {
                            dp[i][j][k] = min(dp[i][j][k],dp[i - 1][h][k - 1] + p[i][j]);
                        }
                    }
                }
            }
        }
        else
        {
            for (int k = 1; k <= i + 1; k++)  //分成了k段
            {
                for(int h = 1; h <= m; h++)  //前面那个树是h这种颜色
                {
                    if (c[i] == h)  //如果当前这棵树和前面那棵树染的颜色相同
                    {
                        dp[i][c[i]][k] = min(dp[i][c[i]][k], dp[i - 1][h][k]);
                    }
                    else  //不同,段数 + 1
                    {
                        dp[i][c[i]][k] = min(dp[i][c[i]][k],dp[i - 1][h][k - 1]);
                    }
                }
            }

        }
    }
    LL ans = INF;
    for (int i = 1; i <= m; i++)
    {
        ans = min(ans,dp[n - 1][i][k]);
    }
    if (ans == INF) ans = -1;
    cout << ans << endl;
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

CodeForces 711C.Coloring Trees【DP】

题目链接http://codeforces.com/problemset/problem/711/C思路设dp[i][x][l]代表涂完前i棵树,美丽值为x,最后一棵树的颜色为l的最小代价。 那么...

Codeforces Problem 711C Coloring Trees(DP)

Codeforces Problem 711C Coloring Trees(DP)

CodeForces - 711C Coloring Trees 三维DP

题目大意输入nn,mm,kk,n表示有多少棵树,m表示有多少中颜色可以给树添加,k表示完美树的个数, 下面的n行表示给第ii棵树染色jj需要的花费,问把树染成k个完美树需要的最小花费。 第二行0表...

Codeforces711C-Coloring Trees(dp)

题目链接http://codeforces.com/contest/711/problem/C思路dp,状态还是比较好表示 **状态表示**d[i][j][k],前i个树都已经染色, 第i棵树颜色为...
  • Lzedo
  • Lzedo
  • 2016-09-23 20:56
  • 96

【动态规划】Codeforces 711C Coloring Trees

题目链接:   http://codeforces.com/problemset/problem/711/C 题目大意:   给N棵树,M种颜色,已经有颜色的不能涂色,没颜色为0...

【Codeforces Round #369 (Div. 2)】Codeforces 711C Coloring Trees

动态规划

codeforces Round_369 C. Coloring Trees

C. Coloring Trees

Codeforces Round #369 (Div. 2) C. Coloring Trees

ZS the Coder and Chris the Baboon has arrived at Udayland! They walked in the park where n trees gr...

Codeforces #369(Div.2) C.Coloring Trees【Dp】

Coloring Trees Description ZS the Coder and Chris the Baboon has arrived at Udayland! ...

codeforces round 369div2 C Coloring Trees

ZS the Coder and Chris the Baboon has arrived at Udayland! They walked in the park where n trees gro...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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