题目链接:http://lightoj.com/volume_showproblem.php?problem=1017

#include <cstdio> #include <cstring> #include <iostream> #include <cmath> #include <algorithm> #include <queue> #include <vector> using namespace std; const int maxe = 50000; const int maxn = 105; const int INF = 0x3f3f3f; int main() { //freopen("E:\acm\input.txt","r",stdin); int Y[maxn]; int dp[maxn][maxn]; //dp[i][j]表示在i次moves中,点标号从1到j中的清理最大污点数; int Move[maxn]; //Move[i]表示在一次move中从点i开始能够清理的最大点数。 int N,W,K; int T; cin>>T; for(int t=1;t<=T;t++){ scanf("%d %d %d",&N,&W,&K); int a; for(int i=1;i<=N;i++) scanf("%d %d",&a,&Y[i]); memset(dp,0,sizeof(dp)); sort(Y+1,Y+N+1); for(int hig=1,low=1; hig<=N ; hig++){ while (Y[hig] - Y[low] > W) low++; Move[hig] = hig-low+1; } for(int i=1;i<=K;i++) for(int j=1;j<=N;j++){ dp[i][j] = max(dp[i][j-1],Move[j]+dp[i-1][j-Move[j]]); } printf("Case %d: %d ",t,dp[K][N]); } }