codeforces 711C dp

一眼dp,但是这道题不知怎么搞遇到点小问题,又搞了搞才出来,就是给你一些颜色。这个点有颜色,不能图,反之可以。问形成k段连续颜色的最小花费。

纯纯的dp,不知道为什么就是有问题。。。终于借鉴了别人的A过了,后面再研究吧。

#include <cstdio>
#include <cstring>
#include <vector>
#include <cmath>
#include <stack>
#include <cstdlib>
#include <queue>
#include <map>
#include <iostream>
#include <algorithm>
#include <bits/stdc++.h>

using namespace std;
typedef long long LL;
LL dp[110][110][110];
LL p[210][210];
LL a[110];
LL inf=0x7f7f7f7f;
int main()
{
    LL n,m,k;
    scanf ("%I64d%I64d%I64d",&n,&m,&k);
    for (LL i=1;i<=n;i++)
    {
        scanf ("%I64d",&a[i]);
    }
    for (LL i=1;i<=n;i++)
    {
        for (LL j=1;j<=m;j++)
        {
            scanf ("%I64d",&p[i][j]);
        }
    }
    memset(dp,inf,sizeof(dp));
    if (a[1])
    {
        dp[1][1][a[1]]=0;
    }
    else
    {
        for (LL i=1;i<=m;i++)
        {
            dp[1][1][i]=p[1][i];
        }

    }
    for (LL i=2;i<=n;i++)
    {
        if (!a[i])
        {
            for (LL x=1;x<i;x++)
            {
                for (LL c=1;c<=m;c++)
                {
                    for (LL 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 (LL x=1;x<i;x++)
            {
                for (LL l=1;l<=m;l++)
                {
                    if (l==a[i])
                        dp[i][x][a[i]]=min(dp[i][x][a[i]],dp[i-1][x][a[i]]);
                    else dp[i][x+1][a[i]]=min(dp[i][x+1][a[i]],dp[i-1][x][l]);
                }
            }
        }
    }
    LL ans=inf;
    for (LL i=1;i<=m;i++)
    {
        ans=min(dp[n][k][i],ans);
    }
    if (ans==inf) ans=-1;
    printf ("%I64d\n",ans);
    return 0;
}

 

posted on 2016-09-08 20:33  very_czy  阅读(179)  评论(0编辑  收藏  举报

导航