zoukankan      html  css  js  c++  java
  • CF711C Coloring Trees(dp)

    根据数据范围,可以看出能够看出可以构建三维dp状态为前i个分为k段当前是j色,之后按情况更新

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<map>
    #include<algorithm>
    #define ull unsigned long long
    using namespace std;
    typedef long long ll;
    const int N=1e5+10;
    ll f[102][102][102];
    ll p[110][110];
    int c[110];
    int main(){
        int n,m,k;
        cin>>n>>m>>k;
        int i;
        for(i=1;i<=n;i++){
            cin>>c[i];
        }
        int j;
        for(i=1;i<=n;i++){
            for(j=1;j<=m;j++){
                cin>>p[i][j];
            }
        }
        memset(f,0x3f,sizeof f);
        if(c[1]==0){
            for(i=1;i<=m;i++){
                f[1][i][1]=p[1][i];
            }
        }
        else
            f[1][c[1]][1]=0;
        ll tmp=1e18;
        int l;
        int r;
        for(i=2;i<=n;i++){
            for(j=1;j<=k;j++){
                if(j>i)
                    break;
                if(c[i]!=0){
                    for(l=1;l<=m;l++){
                        if(l==c[i]){
                            f[i][l][j]=min(f[i][l][j],f[i-1][l][j]);
                        }
                        else{
                            f[i][c[i]][j]=min(f[i][c[i]][j],f[i-1][l][j-1]);
                        }
                    }
                }
                else{
                    for(l=1;l<=m;l++){
                        for(r=1;r<=m;r++){
                            if(l==r)
                                f[i][l][j]=min(f[i][l][j],f[i-1][r][j]+p[i][l]);
                            else
                                f[i][l][j]=min(f[i][l][j],f[i-1][r][j-1]+p[i][l]);
                        }
    
                    }
                }
            }
        }
        ll ans=1e18;
        if(c[n]){
            ans=f[n][c[n]][k];
        }
        else{
           for(i=1;i<=m;i++){
            ans=min(ans,f[n][i][k]);
        }
        }
        if(ans>=1e18/2)
            cout<<-1<<endl;
        else
            cout<<ans<<endl;
    }
    View Code
  • 相关阅读:
    26.列表的循环遍历
    效率比较--链表
    心之距离 再回首 光年之遥远
    效率比较--集合
    效率比较--数组
    哈希表
    栈 VS 队列
    struts1 标签引入
    web 连接池配置
    zip&ftp命令
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/12608789.html
Copyright © 2011-2022 走看看