动态规划之最长上升子序列 HDU1950

本文介绍了如何解决最长上升子序列问题,提供了两种方法:一种是利用递推公式dp[i]=max(1,dp[j]+1);另一种是寻找相等长度但末尾元素较小的子序列。并给出了HDU1950例题作为应用示例。" 109499635,9509085,Ceph分布式存储:OSD添加与删除指南,"['分布式存储', 'Ceph', 'OSD管理']
摘要由CSDN通过智能技术生成

最长上升子序列问题求的是形如一个数列a={4,2,3,1,5},那么这个数列的最长上升子序列就是{2,3,5}

求解这种问题有两种方法,第一种是求当前元素之前元素的最长上升子序列,得到递推公式dp[i]=max(1,dp[j]+1)意思是仅当前元素或者前一元素递推得到的最长上升子序列+当前元素,第二种是求相等长度的上升子序列,最后一个元素越小,则该子序列的“上升潜力”越大

方法一:
int dp[maxn];
int num[maxn];
int slove()
{
int res=0;
for(int i=0;i<n;i++)
{dp[i]=1;
 for(int j=0;j<i;j++)
 if(num[i]>num[j])

   dp=max(dp[i],dp[j]+1); 
 res=max(dp[i],res);
   }
return res;
}


 方法一的弊端在于其时间复杂度为n^2,在解决一些问题时会超时,在后文中有一个例子
方法二:

int dp[maxn];
int num[maxn];
int INF=0x3f3f3f3f;
int solve()
{
 memset(dp,INF,dp+n);
 for(int i=0;i<n;i++)
  *lower_boun
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值