lightoj1017 dp

题目链接: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\n",t,dp[K][N]);
    }
}
View Code

 

posted @ 2013-08-26 14:02  等待最好的两个人  阅读(154)  评论(0编辑  收藏  举报