joj 2529

本文介绍了一种求解最长上升子序列的算法实现,通过双向动态规划分别从左到右和从右到左扫描数组来确定每个元素在最长上升子序列中的位置。此算法能够高效地找出序列中最长的上升子序列长度。

最长上升子序列 

 

#include <iostream>
using namespace std;
int main()
{
 int a[110], u[110], d[110];
 int n, i, j, m;
 while ( cin >> n )
 {
  for( i = 0; i < n; i++)
  {
   cin >> a[i];
  }
/*  for( i = 0; i < n; i++)
  {
   u[i] = 0;
   d[i] = 0;
  }  */
  u[0] = 1;
  for( i = 1; i < n; i++)
  {
   u[i] = 1;
   for( j = 0; j < i; j++)
   {
    if( a[j] < a[i] && u[j] + 1 > u[i])
    {
     u[i] = u[j] + 1;
    }
   }
/*   for( j = 0; j < n; j++)
   {
    cout << u[j] << " ";
   }
   cout << endl;*/
  }
/*  cout << endl;
  for( i = 0; i < n; i++)
  {
   cout << u[i] << " ";
  }
  cout << endl << endl;; */
  d[n - 1] = 1;
  for(i = n-2; i >= 0; i--)
  {
   d[i] = 1;
   for( j = n -1; j > i; j--)
   {
    if(a[j] < a[i] && d[j] + 1 > d[i])
    {
     d[i] = d[j] + 1;
    }
   }
/*   for( j = 0; j < n; j++)
   {
    cout << d[j] << " ";
   }
   cout << endl;  */
  }
/*  cout << endl;
  for( i = 0; i < n; i++)
  {
   cout << d[i] << " ";
  }
  cout << endl << endl; */
  m = 0;
  for( i = 0; i < n; i++)
  {
   if( u[i] + d[i] > m)
   {
    m = u[i] + d[i];
   }
  }
  m--;
  cout << n - m << endl;
 }
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值