HDU 4293--Groups

来源:互联网 发布:wlan流量和数据流量 编辑:程序博客网 时间:2024/05/21 17:28

来源:http://acm.hdu.edu.cn/showproblem.php?pid=4293

题意:有n个人,可任意分成若干组,然后每个人个各提供一个信息,表示他们组前面有多少人,后面有多少人。问最多有多少个信息是不冲突的。

分析:给n个人编号1到n,一个组报出前后有多少人时可以算出这组的人的区间,这样就可以把本题转化成给定一些带权值的区间,求不相交区间的最大权值。这样就可以先按区间排个序,然后依次更新就行了。

#include <iostream>#include <cstdio>#include <cmath>#include <string>#include <cstring>#include <cstdlib>#include <algorithm>using namespace std;const int N = 505;int mp[N][N], dp[N];struct point{    int a, b;} p[N];bool cmp(point x, point y){    if(x.b!=y.b) return x.b<y.b;    else return x.a < y.a;}int main(){    int n, a, b;    while(scanf("%d", &n)!=EOF)    {        for(int i=0; i<n; i++)        {            scanf("%d%d", &a, &b);            p[i].a = a+1;            p[i].b = n-b;        }        sort(p, p+n, cmp);        memset(mp, 0, sizeof(mp));        memset(dp, 0, sizeof(dp));        for(int i=0; i<n; i++)        {            a = p[i].a, b = p[i].b;            if(a>b)                 continue;            if(mp[a][b]>=b-a+1)                 continue;            mp[a][b]++;            dp[b] = max(dp[b], dp[a-1]+mp[a][b]);            for(int j=b+1; j<=n; j++)                dp[j] = dp[b];        }        printf("%d\n", dp[n]);    }    return 0;}


 

原创粉丝点击