hdu6249 区间动态规划

题目链接

题意:给出一些区间,求选k个区间能覆盖的最多点的数量

思路:定义dp[i][j]为前i个点取j个区间的最大值。dp[i][j]可以转移到dp[i+1][j+1]和以i+1为起点的区间终点

具体可以看代码

#include <iostream>
#include <cstdio>
using namespace std;
#define ll long long

const int maxn = 2005;

int t[maxn],dp[maxn][maxn];
int main()
{
    int T;
    cin>>T;
    for(int cn=1;cn<=T;cn++)
    {
        int ans=0;
        int n,m,k;
        scanf("%d %d %d",&n,&m,&k);
        for(int i=0;i<=n;i++)
        {
            for(int j=0;j<=k;j++)dp[i][j]=0;
            t[i]=0;
        }
        for(int i=1;i<=m;i++)
        {
            int x,y;
            scanf("%d %d",&x,&y);
            for(int j=x;j<=y;j++)
            {
                t[j]=max(t[j],y);
            }
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=k;j++)
            {
                if(t[i])
                    dp[t[i]][j]=max(dp[t[i]][j],dp[i-1][j-1]+t[i]-i+1);
                dp[i][j]=max(dp[i][j],dp[i-1][j]);
            }
        }
        for(int i=1;i<=n;i++)
            for(int j=1;j<=k;j++)
                ans=max(ans,dp[i][j]);
         cout<<"Case #"<<cn<<": ";
        cout<<ans<<endl;
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/carcar/p/9657051.html

时间: 2024-12-19 12:36:25

hdu6249 区间动态规划的相关文章

[ACM] POJ 1141 Brackets Sequence (区间动态规划)

Brackets Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 25087   Accepted: 7069   Special Judge Description Let us define a regular brackets sequence in the following way: 1. Empty sequence is a regular sequence. 2. If S is a re

区间动态规划-DFS种类数(SOJ 2469)

2469: Exploring Pyramids 问题:给出一棵树我们可以写出它的深搜结果,现在给出深搜结果字符串$S$求解对应树的种类数. 例子:深搜结果:$ABABABA$,对应的树(根结点在底层)有$5$个. 分析:应用区间动态规划,定义$dp[i][j]$为$S[i..j]$对应的树的个数,则分两类: (1)$S[i]$有一个子结点(上例中前两种情况),$S[i..j]$对应的树的个数就等于$S[i+1..j-1]$对应的树的个数,前提是$S[i]=S[j]$.即,若$S[i]=S[j]

【算法?日更?第八期】区间动态规划:1572:括号配对题解

废话不多说,直接上题: 题目测评链接:戳这里 其实什么GBE都没用,小编最开始看了半天不懂,看了看别人的博客才知道这段话没什么用处.其实就是给一段字符串,判断是否括号是配对的. 这道题一看就会想到区间动态规划(不会戳这里临时补一补),最开始先老老实实地写了一遍区间动态规划,后来觉得用栈也可以,于是写了一遍,代码如下: 1 #include<iostream> 2 #include<cstring> 3 #include<stack> 4 using namespace

区间动态规划

区间 DP是指在一段区间上进行的一系列动态规划. 对于区间 DP 这一类问题,我们需要计算区间 [1,n] 的答案,通常用一个二维数组 dp 表示,其中 dp[x][y] 表示区间 [x,y]. 有些题目,dp[l][r] 由 dp[l][r?1] 与 dp[l+1][r] 推得:也有些题目,我们需要枚举区间 [l,r] 内的中间点,由两个子问题合并得到,也可以说 dp[l][r] 由 dp[l][k] 与 dp[k+1][r] 推得,其中 l≤k<r. 对于长度为 n 的区间 DP,我们可以先

SPOJ 345 - Mixtures 区间动态规划

有n个混合物排成一排,每个混合物有一个颜色值0<=color<=99, 规定合并只能合并相邻两个, 将颜色a的混合物与颜色b的混合物合并后,颜色为( a+b ) % 100,并产生a*b的污染, 现在要将所有混合物合并,问产生污染的最小值. [区间动规]很经典的区间动规 dp[i][j] = min { dp[i][k] + dp[k+1][j] + sum[i][k]*sum[k+1][j] } 具体的DP次序详见代码: #include<cstdio> #include<

poj 1160 Post Office (区间动态规划)

Post Office Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 15966   Accepted: 8671 Description There is a straight highway with villages alongside the highway. The highway is represented as an integer axis, and the position of each villa

动态规划——区间

Wikioi 1048 石子归并 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代价为两堆石子的重量和w[i]+w[i+1].问安排怎样的合并顺序,能够使得总合并代价达到最小. 输入描述 Input Description 第一行一个整数n(n<=100) 第二行n个整数w1,w2...wn  (wi <= 100) 输出描述 Output Description 一个整数表示最小合并代价 样例输入 Sample

动态规划(2)--括号匹配(二)

括号匹配(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:6 描述给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来.如:[]是匹配的([])[]是匹配的((]是不匹配的([)]是不匹配的 输入 第一行输入一个正整数N,表示测试数据组数(N<=10)每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超

2017清北学堂集训笔记——动态规划Part2

啊~到下午啦,我们进入Part2!--一个简洁的开头 我们来探讨第一类问题--路径行走问题 经典例题:方格取数(Luogu 1004) 设有 N*N 的方格图 (N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字 0.* 某人从图的左上角的 A 点出发,可以向下行走,也可以向右走,直到到达右下角的 B 点.在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字 0).* 此人从 A 点到 B 点共走两次,试找出 2 条这样的路径,使得取得的数之和为最大.- 与数字金字塔