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;
}
时间: 2024-10-07 15:23:21

codeforces 711C dp的相关文章

codeforces 449D DP+容斥

Jzzhu and Numbers Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Appoint description:  System Crawler  (2014-07-20) Description Jzzhu have n non-negative integers a1, a2, ..., an. We will call a sequence o

CodeForces 711C Coloring Trees (DP)

题意:给定n棵树,其中有一些已经涂了颜色,然后让你把没有涂色的树涂色使得所有的树能够恰好分成k组,让你求最少的花费是多少. 析:这是一个DP题,dp[i][j][k]表示第 i 棵树涂第 j 种颜色恰好分成 k 组,然后状态转移方程是什么呢? 如果第 i 棵已经涂了,那么要么和第 i-1 棵一组,要么不和第 i-1 棵一组. 如果第 i 棵没有涂,和上面差不多,就是加上要涂的费用,并且要选择最少的. 代码如下: #pragma comment(linker, "/STACK:1024000000

CodeForces 706C dp

C - Hard problem Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice CodeForces 706C Description Vasiliy is fond of solving different tasks. Today he found one he wasn't able to solve himself, so he as

codeforces的dp专题

1.(467C)http://codeforces.com/problemset/problem/467/C 题意:有一个长为n的序列,选取k个长度为m的子序列(子序列中不能有位置重复),求所取的k个序列求和的最大值是多少 分析:设dp[i][j]在[j,n]范围内取了i个子序列求和所得的最大值,用sum[i]表示[1,i]的求和.转移方程为dp[i][j]=max(dp[i-1][j+m]+sum[j+m-1]-sum[j-1],dp[i][j+1]),表示要不要选择[j,j+m-1]这段为其

Codeforces 404D [DP]

/* 我是一个习惯后悔,但是没办法忍受内疚感的二货== 这题是个无脑dp,但是比赛大概20min没出...其实最后5min我好好想想简单化边界条件,可以出的. 题意: 给你一个长度为1e6的由?*01四种字符组成的字符串,类似扫雷,?代表当前不确定,0代表当前无雷,并且 两边无雷,1代表当前五雷且两边有一个雷,2同样的,问当所有格子已知以后一共有多少种可能的局面. 思路: 首先想到的是,这个问题无后效性,而当前位置的合法方式只与它之前的两位有关. 所以dp的思路也是显而易见的,即dp[i][j]

codeforces 608C:(dp)

从又往左点灯塔,点亮一个的同时,往左di范围内的灯塔全部被破坏.现在能在最右端按一个灯塔,攻击范围任意,问到最后最少有几个灯塔留下 用dp瞎搞.具体看代码吧 #include"cstdio" #include"queue" #include"cmath" #include"stack" #include"iostream" #include"algorithm" #include&quo

Codeforces 721C [dp][拓扑排序]

/* 题意:给你一个有向无环图.给一个限定t. 问从1点到n点,在不超过t的情况下,最多可以拜访几个点. 保证至少有一条路时限不超过t. 思路: 1.由无后向性我们可以知道(取决于该图是一个DAG),这题一定可以dp. 2.dp[i][j]代表,到达点i,并且拜访了j个城市的最短时间. wa点: 没有初始化数组中的0.. */ #include<bits/stdc++.h> #define N 5050 using namespace std; int inf=0x3f3f3f3f; int

CodeForces 607C (DP) Hard problem

题目:这里 题意:给定n个字符串,每个字符串可以进行一项操作,就是将这个字符串交换,就是该字符串的第一个和最后一个交换,第二个和倒数第二个交换,以此类推,当然可以选择对于 该字符串进行或不进行这项操作,而每个字符串都有一个相应的能量值,进行操作了就要消耗那么多能量值,最后是否能在消耗的能量值最小的情况下保证这些字符串是升序的( 字典序从小到大),不能就输出-1. 字符串用string,DP,dp[i][j]表示到第i个字符串的状态为j的时候(j为1表示这个串交换了,j为0表示这个串没有交换),注

CodeForces 567F DP Mausoleum

1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <vector> 6 #include <map> 7 #define MP make_pair 8 using namespace std; 9 10 typedef long long LL; 11 12 const int maxn =