hdu6249 Alice’s Stamps(dp好题!)

版权声明:本文为博主原创文章,转载请说明出处。 https://blog.csdn.net/xianpingping/article/details/83217234

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;
}

猜你喜欢

转载自blog.csdn.net/xianpingping/article/details/83217234