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\n", dp[n]); 47 } 48 return 0; 49 }