hdu 4293 2012成都赛区网络赛 dp ****

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

将n个人看成一组区间,然后每个人的信息可以表示为该人所在组的区间,然后求最大不相交的区间个数(区间可以完全覆盖),注意不是区间长度,长度是贪心

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <string>
 5 #include <cstring>
 6 #include <cstdlib>
 7 #include <algorithm>
 8 using namespace std;
 9 const int N = 505;
10 int mp[N][N], dp[N];
11 struct point
12 {
13     int a, b;
14 } p[N];
15 bool cmp(point x, point y)
16 {
17     if(x.b!=y.b) return x.b<y.b;
18     else return x.a < y.a;
19 }
20 int main()
21 {
22     int n, a, b;
23     while(scanf("%d", &n)!=EOF)
24     {
25         for(int i=0; i<n; i++)
26         {
27             scanf("%d%d", &a, &b);
28             p[i].a = a+1;
29             p[i].b = n-b;
30         }
31         sort(p, p+n, cmp);
32         memset(mp, 0, sizeof(mp));
33         memset(dp, 0, sizeof(dp));
34         for(int i=0; i<n; i++)
35         {
36             a = p[i].a, b = p[i].b;
37             if(a>b)
38                 continue;
39             if(mp[a][b]>=b-a+1)
40                 continue;
41             mp[a][b]++;
42             dp[b] = max(dp[b], dp[a-1]+mp[a][b]);
43             for(int j=b+1; j<=n; j++)
44                 dp[j] = dp[b];
45         }
46         printf("%d
", dp[n]);
47     }
48     return 0;
49 }
原文地址:https://www.cnblogs.com/cnblogs321114287/p/4750295.html