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 }