矩形套矩形解题报告

最长递增子序列

这到题给我的启发是:
1,最长递增子序列实际上就是不知道起点的动规模型。
2,动规运用在有序的数据上(如果不对矩形进行排序处理,就没有“前面的矩形不可能包含后面矩形的断言”==“前面的数小于后面的数”)

做法:排序+最长递增子序列
动规方程: f[i]=max(f[j]+1)(1<=j<i, a[j]<a[i]&&b[j]<b[i]) ==最长递增子序列的动规方程

 1 #include <stdio.h>
 2 int a[1001], b[1001], f[1001];
 3 void qsort(int l, int r)
 4 {
 5     int x, y, mid1, mid2, temp;
 6     mid1=a[(l+r)/2];
 7     mid2=b[(l+r)/2];
 8     x=l; 
 9     y=r;
10     while(x<=y)
11     {
12         while(a[x]<mid1||(a[x]==mid1&&b[x]<mid2))    x++;
13         while(a[y]>mid1||(a[y]==mid1&&b[y]>mid2))    y--;
14         if(x<=y)
15         {
16             temp=a[x];
17             a[x]=a[y];
18             a[y]=temp;
19             temp=b[x];
20             b[x]=b[y];
21             b[y]=temp;
22             x++;
23             y--;
24         }
25     }
26     if(l<y)    qsort(l, y);
27     if(x<r)    qsort(x, r);
28 }
29 int main()
30 {
31     int n, i, k, temp, ans=1;
32     scanf("%d", &n);
33     for(i=1; i<=n; i++)
34     {
35         scanf("%d%d", &a[i], &b[i]);
36         if(a[i]<b[i])
37         {
38             temp=a[i];
39             a[i]=b[i];
40             b[i]=temp;
41         }
42     }
43     qsort(1, n);
44     for(i=1; i<=n; i++)
45     {
46         for(k=1; k<i; k++)
47         {
48             if(a[i]>a[k]&&b[i]>b[k]&&f[k]+1>f[i])
49             {
50                 f[i]=f[k]+1;
51             }
52         }
53         if(f[i]>ans)    ans=f[i];
54     }
55     printf("%d", ans+1);
56     return 0;
57 }
完整代码
原文地址:https://www.cnblogs.com/formiko/p/4418310.html