題目意思:
對于給定的矩形塊,寬a,長b,而對于其他的矩形塊,如果寬度小于等于a,長度小于等于b,它可以被(a,b)的矩形塊覆蓋.題目意思就是給n個矩形塊,并且已知每個矩形塊的寬度和長度..讓你求覆蓋之后最大的塊數..
比如 有3塊矩形塊
1 1
2 3
3 2
則 (1,1)可被(2,3)覆蓋 (1,1)也可被(3,2)覆蓋 而(2,3)不能被(3,2) 所以覆蓋之后最多只能有2塊。。
所以(a1,b1)<=(a2,b2)的情況下,可以被覆蓋,故這題應該變成一個二維的最大上升子序列。
故可以考慮對寬度a進行從小到大排列之后.可對長度b求最大上升子序列.
最大上升子序列的求法就是.
考慮b[i]當前這個數 對于i之前的數b[j](0<=j<i) 如果(b[j]<b[i])則稱b[i]可由b[j]到達.
則dp[i]=max(dp[j]+1){(b[j]<b[i]&&0<=j<i).而最大上升子序列個數就為max(dp[i]) (0<=i<n)
代碼如下:
#include<iostream>
using namespace std;
int d[10001][2],n,dp[10001];
int cmp(void const *a,void const *b)


{
int *aa=(int *)a,*bb=(int *)b;
if(aa[0]!=bb[0])
return aa[0]-bb[0];
else
return aa[1]-bb[1];
}
int main()


{
while(cin>>n,n)

{
for(int i=0;i<n;i++)
cin>>d[i][0]>>d[i][1];
qsort(d,n,sizeof(d[0]),cmp);
for(int i=0;i<n;i++)
dp[i]=1;
int max=0;
for(int i=1;i<n;i++)

{
for(int j=0;j<i;j++)

{
if(d[j][1]<=d[i][1]&&dp[i]<dp[j]+1)
dp[i]=dp[j]+1;
}
if(max<dp[i])
max=dp[i];
}
cout<<max<<endl;
}
cout<<'*'<<endl;
}
posted on 2009-03-31 15:58
米游 閱讀(425)
評論(0) 編輯 收藏 引用 所屬分類:
ACM