codeforces 711C Coloring Trees(DP)

来源:互联网 发布:安装java后怎么运行 编辑:程序博客网 时间:2024/05/17 02:11

题目链接:http://codeforces.com/problemset/problem/711/C

O(n^4)的复杂度,以为会超时的

思路:dp[i][j][k]表示第i棵数用颜色k涂完后beauty为j

#include<bits/stdc++.h>using namespace std;typedef long long ll;const ll inf=1e15;int c[105];int p[105][105];ll dp[105][105][105];int main(){    int n,m,b;    scanf("%d%d%d",&n,&m,&b);    for(int i=1;i<=n;i++)        scanf("%d",&c[i]);    for(int i=1;i<=n;i++)    {        for(int j=1;j<=m;j++)            scanf("%d",&p[i][j]);    }    for(int i=1;i<=n;i++)    {        for(int j=1;j<=b;j++)        {            for(int k=1;k<=m;k++)                dp[i][j][k]=inf;        }    }    for(int i=1;i<=n;i++)    {        if(c[i])        {            for(int j=1;j<=b&&j<=i;j++)            {                int k=c[i];                ll min1=inf,min2=inf;                if(k>1&&j>1)                    min1=*min_element(dp[i-1][j-1]+1,dp[i-1][j-1]+k);                if(k<m&&j>1)                    min2=*min_element(dp[i-1][j-1]+k+1,dp[i-1][j-1]+m+1);                dp[i][j][k]=min(dp[i-1][j][k],min(min1,min2));            }        }        else        {            for(int j=1;j<=b&&j<=i;j++)            {                for(int k=1;k<=m;k++)                {                    ll min1=inf,min2=inf;                    if(k>1&&j>1)                        min1=*min_element(dp[i-1][j-1]+1,dp[i-1][j-1]+k);                    if(k<m&&j>1)                        min2=*min_element(dp[i-1][j-1]+k+1,dp[i-1][j-1]+m+1);                    dp[i][j][k]=p[i][k]+min(dp[i-1][j][k],min(min1,min2));                }            }        }    }    ll ans=*min_element(dp[n][b]+1,dp[n][b]+m+1);    if(ans<inf)        printf("%I64d\n",ans);    else        printf("-1\n");    return 0;}


0 0
原创粉丝点击