POJ 2533 Longest Ordered Subsequence 动态规划

题意

本题求从1 到 n的最长上升子序列的长度

分析

最优化问题
考虑dp
我们求1-n最长上升子序列长度
假设记录在dp[n]中
假设我们已经知道了1—n-1的以第n-1为最后一个元素的最长上升序列的长度
那么我们拿到第n个元素不就可以判断如果这个n比n-1位置上的元素大
那么就让dp[n] = dp[n-1]+1不就可以了吗
那么dp[n-1]又怎么得到
我们需要得到dp[n-2]
那么dp[n-2]咋知道 我们需要dp[n-3]。。。
所以我们不如从前面开始推
设置dp数组 dp[i]表示以第I个元素为结尾的从1到n最长上升子序列的长度
也就是我们要从第一个元素x开始向后扫
如果后面的元素比x大 那么就让dp[I] = dp[1]+1;
那么这里我们看到需要把dp[i]全部都初始化为1
只有这样才能得到正确累计的数量
可是我们发现 如果每个元素都做此相同步骤
我们需要考虑就是如果这个dp[i]本来就比dp[枚举元素]+1 大 我们就不能直接赋值了
因为这个元素可能已经被前面的某些元素已经搞得比较大了
所以我们得到最终的递推关系
dp[j]=max(dp[j],dp[i]+1);

CODE

#include<bits/stdc++.h>
using namespace std;
int a[1010],dp[1010];

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        dp[i]=1;
    }
    for(int i=1;i<n;i++){
        for(int j=i+1;j<=n;j++){
            if(a[j]>a[i])dp[j] = max(dp[i]+1,dp[j]);
        }
    }
    int ans=-1;
    for(int i=1;i<=n;i++){
        ans = max(dp[i],ans);
    }
    printf("%d\n",ans);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值