• LightOJ 1017 Brush (III) 【DP】


    题目链接

    题意

    墙上有N个污点,知道它们的坐标(xi,yi)。现有一把宽度为w的刷子,将刷子固定在一个高度就可以沿着平行于x轴的方向刷除污点。总操作次数最多为k,求最多能够刷除掉多少污渍

    分析

    我们以刷子底部的y坐标来刻画刷子的位置。首先既然刷子会沿着平行x轴的方向刷出这个高度所有的污点,那么可以不管污点的x坐标。
    先预处理一下,把污点高度从大到小排个序(因为我们是以刷子的下部作为刷子的位置,那么刷高处的点是不会影响到下面的点),求出以某个污点的高度作为刷子放置的位置能够刷掉上面多少个点,记录为wipe[i]
    接下来DP,设状态:

    dp[i][j]ij

    状态转移方程:

    dp[i][j]={dp[i1][j]idp[iwipe[i]][j1]+wipe[i]i

    AC代码

    //LightOJ 1017 Brush (III)
    //AC 2016-8-8 17:24:13
    //DP
    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <cctype>
    #include <cstdlib>
    #include <cstring>
    #include <vector>
    #include <set>
    #include <string>
    #include <map>
    #include <queue>
    #include <deque>
    #include <list>
    #include <sstream>
    #include <stack>
    using namespace std;
    
    #define cls(x) memset(x,0,sizeof x)
    #define inf(x) memset(x,0x3f,sizeof x)
    #define neg(x) memset(x,-1,sizeof x)
    #define ninf(x) memset(x,0xc0,sizeof x)
    #define st0(x) memset(x,false,sizeof x)
    #define st1(x) memset(x,true,sizeof x)
    #define INF 0x3f3f3f3f
    #define lowbit(x) x&(-x)
    #define input(x) scanf("%d",&(x))
    #define bug cout<<"here"<<endl;
    //#define debug
    
    int T,N,w,k;
    int Y[200],wipe[200];
    int dp[200][200];
    
    int main()
    {
        #ifdef debug
            freopen("E:\Documents\code\input.txt","r",stdin);
            freopen("E:\Documents\code\output.txt","w",stdout);
        #endif
        input(T);
        for(int kase=1;kase<=T;++kase)
        {
            scanf("%d %d %d",&N,&w,&k);
            for(int i=1;i<=N;++i)
                scanf("%*d %d",&Y[i]);
            sort(Y+1,Y+N+1,greater<int>());
            cls(wipe);
            for(int i=1;i<=N;++i)
                for(int j=i;j>=1&&Y[j]-Y[i]<=w;--j)
                    ++wipe[i];
            cls(dp);
            for(int i=1;i<=N;++i)
                for(int j=1;j<=k;++j)
                    dp[i][j]=max(dp[i-1][j],dp[i-wipe[i]][j-1]+wipe[i]);
            printf("Case %d: %d
    ",kase,dp[N][k]);
        }
        return 0;
    }
  • 相关阅读:
    asp.net 2.0 run
    Regular Expression
    assembly
    asp.net loading..
    session
    asp.net performance
    asp.net page order
    interface
    UVA 562 Dividing coins
    UVA 10003 Cutting Sticks
  • 原文地址:https://www.cnblogs.com/DrCarlluo/p/6580593.html
Copyright © 2020-2023  润新知