loj 1017(dp)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25843

思路:我们可以发现题目与点的X坐标没有关系,于是可以直接对y坐标进行排序,然后进行dp,dp[i][j]表示以j个区间覆盖前i个点的最大覆盖数。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 #define MAXN 111
 7 #define FILL(a,b) memset(a,b,sizeof(a))
 8 
 9 int n,w,k,dp[MAXN][MAXN];
10 int y[MAXN];
11 int pre[MAXN],num[MAXN];
12 
13 int main()
14 {
15     int _case,x,t=1;
16     scanf("%d",&_case);
17     while(_case--){
18         scanf("%d%d%d",&n,&w,&k);
19         for(int i=1;i<=n;i++){
20             scanf("%d%d",&x,&y[i]);
21         }
22         sort(y+1,y+1+n);
23         FILL(dp,0);
24         int p1=1,p2=1;
25         pre[1]=0,num[1]=1;
26         while(p1<=n){
27             p1++;
28             while(y[p1]-y[p2]>w)p2++;
29             pre[p1]=p2-1;
30             num[p1]=p1-p2+1;
31         }
32         for(int i=1;i<=n;i++){
33             for(int j=1;j<=k;j++){
34                 dp[i][j]=max(dp[i-1][j],dp[pre[i]][j-1]+num[i]);
35             }
36         }
37         printf("Case %d: %d
",t++,dp[n][k]);
38     }
39     return 0;
40 }
View Code
原文地址:https://www.cnblogs.com/wally/p/3351869.html