Light OJ 1017 Brush (III) (dp)

来源:互联网 发布:深圳网络诈骗律师 编辑:程序博客网 时间:2024/05/16 07:26

题意:平面有n个点,一次操作能去除x轴方向上宽度为w(x<=y<=x+w,x为任意值)的所有的点。问最多k次操作,能去除的点的个数的最大值。

解析:简单DP

将点按照y坐标排序,dp[k][i]为对前i个点k次操作的最大值,且第k次清除 a[i]-w<=y<=a[i]区域内的所有的点。

递推方程见代码。

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int n,w,m,a[105];int dp[105][105];int main(){    int i,j,k,T,cas,c;    scanf("%d",&cas);    for(T = 1;T <= cas;T++){        scanf("%d%d%d",&n,&w,&m);        for(i = 0;i < n;i++){            scanf("%d%d",&c,&a[i]);        }        memset(dp,0,sizeof(dp));        sort(a,a+n);        int ans = 0;        for(k = 1;k <= m;k++){            for(i = 0;i < n;i++){                int p,cnt = 0;                for(j = i;j>=0&&a[j]>=a[i]-w;j--){                    cnt++;                }                dp[k][i] = cnt;                for(p = 0;p <= j;p++) dp[k][i] = max(dp[k][i],cnt+dp[k-1][p]);                ans = max(ans,dp[k][i]);            }        }        printf("Case %d: %d\n",T,ans);    }    return 0;}



0 0