ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

cf711 C. Coloring Trees(dp)

2021-12-15 22:04:47  阅读:167  来源: 互联网

标签:Coloring int cf711 ll nkm long cost col dp


思路:

f(i,j,p)表示第1~i棵树已染色, 染成了j组,第i棵树染成p颜色的最小花费。复杂度 \(O(nkm^2)\)。其实还可以维护2个最值优化到 \(O(nkm)\)

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 105;
int n, m, k, col[N], cost[N][N];
ll f[N][N][N];
signed main()
{
    cin >> n >> m >> k;
    for(int i = 1; i <= n; i++) cin >> col[i];
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            cin >> cost[i][j];

    memset(f, 0x3f, sizeof f);
    if(col[1]) f[1][1][col[1]] = 0;
    else for(int i = 1; i <= m; i++) f[1][1][i] = cost[1][i];

    for(int i = 2; i <= n; i++)
    for(int j = 1; j <= k; j++)
        for(int p = 1; p <= m; p++) //i的颜色
        {
            if(col[i] && col[i] != p) continue;
            for(int q = 1; q <= m; q++) //i-1的颜色
            {
                if(col[i-1] && col[i-1] != q) continue;

                if(p == q) //i和i-1同色
                {
                    if(!col[i]) //i无色
                        f[i][j][p] = min(f[i][j][p], f[i-1][j][q] + cost[i][p]);
                    else if(col[i] == q) //i有色
                        f[i][j][p] = min(f[i][j][p], f[i-1][j][q]);
                }
                else //i和i-1异色
                {
                    if(!col[i]) //i无色
                        f[i][j][p] = min(f[i][j][p], f[i-1][j-1][q] + cost[i][p]);
                    else if(col[i] != q) //i有色
                        f[i][j][p] = min(f[i][j][p], f[i-1][j-1][q]);
                }
            }
        }

    ll ans = 1e18;
    for(int i = 1; i <= m; i++) ans = min(ans, f[n][k][i]);
    cout << (ans < 1e18 ? ans : -1);

    return 0;
}

标签:Coloring,int,cf711,ll,nkm,long,cost,col,dp
来源: https://www.cnblogs.com/wushansinger/p/15695520.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有