hdu6249 Alice’s Stamps(dp好题!)

Alice’s Stamps

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1165    Accepted Submission(s): 415


 

Problem Description

Alice likes to collect stamps. She is now at the post office buying some new stamps.
There are N different kinds of stamps that exist in the world; they are numbered 1 through N. However, stamps are not sold individually; they must be purchased in sets. There are M different stamp sets available; the ith set contains the stamps numbered Li through Ri. The same stamp might appear in more than one set, and it is possible that one or more stamps are not available in any of the sets.
All of the sets cost the same amount; because Alice has a limited budget, she can buy at most K different sets. What is the maximum number of different kinds of stamps that Alice can get?

 

 

Input

The input starts with one line containing one integer T, the number of test cases.T test cases follow.
Each test case begins with a line containing three integers: N, M, and K: the number of different kinds of stamps available, the number of stamp sets available, and the maximum number of stamp sets that Alice can buy.
M lines follow; the ithoftheselinesrepresentsthei^{th} stamp set and contains two integers, Li and Ri, which represent the inclusive range of the numbers of the stamps available in that set.
1≤T≤100
1≤KM
1≤N,M≤2000
1≤LiRiN

 

 

Output

For each test case, output one line containing “Case #x: y”, where x is the test case number (starting from 1) and y is the maximum number of different kinds of stamp that Alice could get.

 

 

Sample Input

 

2 5 3 2 3 4 1 1 1 3 100 2 1 1 50 90 100

 

 

Sample Output

 

Case #1: 4 Case #2: 50

Hint

In sample case #1, Alice could buy the first and the third stamp sets, which contain the first four kinds of stamp. Note that she gets two copies of stamp 3, but only the number of different kinds of stamps matters, not the number of stamps of each kind. In sample case #2, Alice could buy the first stamp set, which contains 50 different kinds of stamps.

 

 

Source

2017中国大学生程序设计竞赛-总决赛-重现赛(感谢哈工大)

 

 

Recommend

liuyiding   |   We have carefully selected several similar problems for you:  6447 6446 6445 6444 6443 

我又一次对肥宅产生了深深的崇拜。有的人呢,没有见过的类型是想不到的。绞尽脑汁可能也找不到正确方向。找到了正确方向可能也想不出来。譬如我。有的人呢,使劲想想或许就能想出来。边玩边想,譬如纪大佬。

偶尔夸一下队友(因为不是很经夸)。如果队友有我一半勤奋,我有队友一半的睿智,就完美了。

题意:

题意很简单,就是给了m段区间,问从里面选出来k段,使得覆盖的面积最广,输出覆盖的最大面积。

思路:

用ri[i]代表从i开始最长的那一段能够覆盖的最靠右的值。

dp[i][j]表示,到了坐标i左面,此时选了j个所能覆盖的最大值。

状态转移方程详见代码。

看了队友代码觉得很简单。重点是想不到。

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#define ll long long
#define mod 1000000007
#define inf 1e9
#define mem(a,x) memset(a,x,sizeof(a))
using namespace std;


int dp[2020][2020];
int ri[2020];
int main()
{
    ios::sync_with_stdio(false);
    int t,cas=1;
    cin>>t;
    while(t--)
    {
        int n,m,k,i,j;
        mem(dp,0);
        mem(ri,0);
        cin>>n>>m>>k;
        while(m--)
        {
            int l,r;
            cin>>l>>r;
            while(l<=r)
            {
                ri[l]=max(ri[l],r);
                l++;
            }
        }
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=k;j++)
            {
                dp[i][j]=max(dp[i][j],dp[i-1][j]);
                dp[ri[i]][j]=max(dp[i-1][j-1]+ri[i]-i+1,dp[ri[i]][j]);
            }
        }
        int res=0;
        for(i=1;i<=n;i++)
        {
            res=max(dp[i][k],res);
        }
        cout<<"Case #"<<cas++<<": "<<res<<endl;
    }
    return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值