zoj1025

这一题是求最大不下降子序列的最少个数,才能锯木头时保证机器调试的次数最少,其实这个问题可以转化一下,就是求最大下降子序列的长度

 

最大下降子序列的中每一个元素,都必须单独在一个不下降子序列里,对吧,听一位大牛讲了很久才明白过来,然后取其他任何一个元素,都可以被这些不下降子序列吸收掉,这样最大下降子序列的长度就是最大不下降子序列的最少个数

 

明白这个以后,此题就好解了,由于本人水平有限,各种函数都是自己写的,而且不习惯用结构体,导致一开始用结构体失败,然后全改成数组了,太水了。。。。。

 

 

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值