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\n",t++,dp[n][k]); 38 } 39 return 0; 40 }