hdu4293Groups

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

这题单拉出来写篇吧 确实不错的一题

将每个人说的话 转化一下 可以算出它处在哪个段中 题目就转换成了求不相交的最大段数 注意区间相同的情况

 1 #include <iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<algorithm>

 5 #include<stdlib.h>

 6 using namespace std;

 7 struct node

 8 {

 9     int l,r;

10 }p[510];

11 int dp[510],w[510][510];

12 bool cmp(node a,node b)

13 {

14     if(a.l==b.l)

15     return a.r<b.r;

16     return a.l<b.l;

17 }

18 int main()

19 {

20     int i,j,k,n,a,b;

21     while(cin>>n)

22     {

23         int g=0;

24         memset(w,0,sizeof(w));

25         for(i = 1; i <= n ;i++)

26         {

27             scanf("%d%d",&a,&b);

28             if(a+b<n)

29             {

30                 g++;

31                 p[g].l = a+1;

32                 p[g].r = n-b;

33             }

34         }

35         sort(p+1,p+g+1,cmp);

36         for(i = 1; i <= g ; i++)

37         {

38             w[p[i].l][p[i].r]++;

39             if(w[p[i].l][p[i].r]>(p[i].r-p[i].l+1))

40             w[p[i].l][p[i].r] = p[i].r-p[i].l+1;

41         }

42         for(i = 1 ;i <= g ; i++)

43         dp[i] = w[p[i].l][p[i].r];

44         for(i = 1; i <= g ; i++)

45             for(j = 1 ; j < i ; j++)

46             if(p[i].l>p[j].r)

47             dp[i] = max(dp[i],dp[j]+w[p[i].l][p[i].r]);

48         int maxz = 0;

49         for(i = 1; i <= g ; i++)

50         maxz = max(dp[i],maxz);

51         cout<<maxz<<endl;

52     }

53     return 0;

54 }
View Code

 

你可能感兴趣的:(group)