LA 3695 Garbage Heap (DP)

来源:互联网 发布:c语言命名规则 编辑:程序博客网 时间:2024/06/01 18:08

题意:给出平面上的N个点,找一个矩形使得边界上的点最多

解:选定上下边界,枚举左右边界;

left[i],i边的左边有多少被包含在上下边界上的点,on[i]i边有多少被包含在上下边界上的点(不包括上下边界),on2[i]包括上下边界;

ans=left[j]-left[i]+on2[j]+on[i]; 当枚举右边界时,保留最优值on[i]-left[i],




#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<cmath>#include<string>#include <bits/stdc++.h>using namespace std;const int N = 1e4+10;char str[1100][1100];map<int,int>q;struct node{    int x, y, cnt;} p[N];int cmp(node A,node B){    return A.x<B.x;}int on[N], on2[N], left1[N], ay[N], n, k1;int solve(){    sort(ay,ay+k1);    sort(p,p+n,cmp);    if(k1<=2) return n;    int ans=0;    for(int i=0; i<k1; i++)    {        for(int j=i+1; j<k1; j++)        {            int ymin=ay[i], ymax=ay[j];            int l=0;            for(int k=0; k<n; k++)            {                if(k==0||p[k].x!=p[k-1].x)                {                    ++l;                    on[l]=on2[l]=0;                    left1[l]=left1[l-1]+on2[l-1]-on[l-1];                }                if(p[k].y>ymin&&p[k].y<ymax) on[l]++;                if(p[k].y>=ymin&&p[k].y<=ymax) on2[l]++;            }            if(l<=2) return n;            int m=0;            for(int h=1; h<=l; h++)            {                ans=max(ans,left1[h]+on2[h]+m);                m=max(m,on[h]-left1[h]);            }        }    }    return ans;}int main(){    int t, ncase=1;    while(scanf("%d", &n),n!=0)    {        q.clear();        k1=0;        for(int i=0; i<n; i++)        {            int x, y;            scanf("%d %d", &x, &y);            p[i].x=x,p[i].y=y;            if(!q.count(y)) q[y]=1;            ay[k1++]=y;        }        printf("Case %d: %d\n",ncase++,solve());    }    return 0;}