Codeforces - 702A - Maximum Increase - 简单dp

本文分享了一名程序员在深入学习动态规划(DP)算法过程中的心得与体会,详细记录了从初学者到熟练掌握DP算法的实践路径。文章首先介绍了DP算法的基础概念,随后通过CodeForces平台上的经典题目进行实战演练,特别剖析了最长上升子序列(LIS)问题的两种复杂度算法实现,并附上了完整的C++代码示例。作者还强调了在解决问题过程中遇到的常见误区,例如将子串问题误认为子序列问题,以此提醒读者在面对实际问题时要仔细区分。文章最后鼓励读者通过大量练习来巩固和提升自己的算法水平。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DP的学习计划,刷 https://codeforces.com/problemset?order=BY_RATING_ASC&tags=dp

遇到了这道题 https://codeforces.com/problemset/problem/702/A

以为是最长上升子序列(Longest Increasomg Subsequence)的模板题,发现自己不会做

 

记录一下大概的思路:

\(O(n^2)\) 的算法:

  • \(L[i]\) 选择 \(A[i]\) 为结尾的LIS的长度
  • \(P[i]\) 选择 \(A[i]\) 为结尾的LIS的倒数第二个元素的Position(可以用来复现整个LIS)
  • 临时变量 \(k\) ,表示 \(A[i]\) 计算时找到的前面最长的LIS的位置
  • 对于每个 \(A[i]\) ,遍历它前面的每个 \(A[j]\) ,记录所有满足 \(A[j]<A[i]\) (可以把 \(A[i]\) 接在后面)且 \(L[j]>L[k]\) (更长的子序列)
  • \(L[i]=L[k]+1\)
  • \(P[i]=k\)

\(O(nlogn)\) 的算法:

  • \(L[i]\) 长度为\(i+1\) 的IS的末位元素的最小值
  • \(length\) 前 \(i\) 个元素构成的LIS的长度
  • 升序遍历 \(i\),故 \(length\) 非降,而且构造的过程中 \(L\) 数组是递增的
  • 如果 \(L[length-1]<A[i]\) ( \(A[i]\) 可以接在当前最长的(长度为 \(length\) 的)LIS后面),则 \(L[length++]=A[i]\)
  • 否则在已确定的 \(L[0]~L[length]\) 中(长度为 \(1\) 到 \(length\) 闭区间的LIS的最末元素)二分找到能更新的位置并更新 $*lower\_bound(L,L+length,A[i])=A[i]$
#include<bits/stdc++.h>
using namespace std;
#define ll long long

int A[100005];
int L[100005];

int lis(){
    L[0]=A[0];
    int length=1;
    for(int i=1;i<n;i++){
        if(L[length-1]<A[i]){
            L[length++]=A[i];
        }
        else{
            *lower_bound(L,L+length,A[i])=A[i];
            //1 7 2 5,已有序列1 7,lower_bound(2)得到7,可以把长度为2的LIS的末尾换成2
        }
    }
    return length;
}

int main(){
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&A[i]);
    }
    printf("%d\n",lis());

}

 

复原的时候也很简单,把$L[0]~L[length-1]$全部输出就可以了

 

但是最后我发现这个702A并不是LIS,因为他不是子序列而是子串!

2019-01-16

转载于:https://www.cnblogs.com/Yinku/p/10278063.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值