PKU-2533(经典的动态规划题)

如果只输出最长顺序子序列的长度,可以用以下的算法:
设D(i)表示以第i个元素为首元素的顺序子序列最大长度,则
当i=n时,D(n)=1
当i<n时,D(i)=max{D(j)+1}    xj>xi且i<j<=n

 

#include  < iostream.h >
#include 
< stdio.h >

// 求最长顺序子序列长度,经典的动态规划思想
int  d[ 1010 ],data[ 1010 ],n;

int  lcs( int  da[], int  n)
{
 
int  i,j,max;
 
 
for (i = 0 ;i < n;i ++ )
  d[i] 
=   1 ;
 
for (i = 0 ;i < n;i ++ )
 {
  
for (j = 0 ;j < i;j ++ )
  {
   
// 序列要包含data[i]的
    if (data[i] > data[j])
   {
    
if (d[i] < d[j] + 1 )
     d[i] 
=  d[j]  +   1 ;
   }
  }
 }
 max 
=   0 ;
 
for (i = 0 ;i < n;i ++ )
 {
  
if (max < d[i])
   max 
=  d[i];
 }
 
return  max;
}

int  main()
{
 
int  i;
 
// freopen("1.txt","r",stdin);
 
    cin
>> n;
 
  
for (i = 0 ;i <= n;i ++ )
  {
   cin
>> data[i];
  }
  cout
<< lcs(data,n) << endl;
 
 
return   0 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值