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

 

posted @ 2013-08-10 19:31  _雨  阅读(202)  评论(0编辑  收藏  举报