这一题是求最大不下降子序列的最少个数,才能锯木头时保证机器调试的次数最少,其实这个问题可以转化一下,就是求最大下降子序列的长度
最大下降子序列的中每一个元素,都必须单独在一个不下降子序列里,对吧,听一位大牛讲了很久才明白过来,然后取其他任何一个元素,都可以被这些不下降子序列吸收掉,这样最大下降子序列的长度就是最大不下降子序列的最少个数
明白这个以后,此题就好解了,由于本人水平有限,各种函数都是自己写的,而且不习惯用结构体,导致一开始用结构体失败,然后全改成数组了,太水了。。。。。
#include <iostream>
#include <cstdlib>
using namespace std;
int Partition(int *a,int *b,int left,int right)
{
int i = left,j = right+1;
int len = a[left],wei = b[left];
while(1)
{
while(a[++i] >= len && i <= right);
while(a[--j] < len);
if(i < j)
{
int temp = a[ i ] ;
a[ i ] = a[ j ] ;
a[ j ] = temp;
temp = b[ i ] ;
b[ i ] = b[ j ];
b[ j ] = temp;
}
else break;
}
a[ left ] = a[ j ];
a[ j ] = len;
b[ left ] = b[ j ];
b[ j ] = wei;
return j;
}
void QSort(int *a,int *b,int left,int right)
{
if(left < right)
{
int mid = Partition( a,b,left,right );
QSort( a,b,left,mid - 1 );
QSort( a,b,mid + 1,right );
}
}
int main(void)
{
int len[10004],wei[10004];
int T,N;
int f[10005];
cin >> T;
while(T--)
{
cin >> N;
for(int i = 1;i <= N;++i)
cin >> len[i] >> wei[i];
QSort( len,wei,1,N );//自己写的快排,哎。。水。。。
f[1] = 1;
for( int i = 1;i <= N;++i )//求最大下降子序列的长度
{
int temp = 0;
for( int j = 1;j < i;++j )
{
if( len[ i ] < len[ j ] && wei[ i ] > wei[ j ] && temp < f[ j ])
temp = f[ j ];
}
f[ i ] = temp + 1;
}
int max = 0;
for( int i = 1; i <= N;++i )
if( f[ i ] > max )
max = f[ i ];
cout << max << endl;
}
return 0;
}