(区间dp最长上升子序列,最长下降子序列)

简介: (区间dp最长上升子序列,最长下降子序列)

思路

特征 求一个最长的序列,中间值前面上升,后面下降

// 然后就可以拆分成以中间值为结尾的最长上升子序列和以中间值为开头的最长下降子序列,分别求后再加在一起即可。

需要注意的是,求得的和需要减一,因为中间值被重复加了两次,长度多了1

题解妙在将题目数组的状态以特殊点为边界,拆解成了两个dp子问题。

套路

以i结尾的最长连续上升子序列

for(int i = 1;i <= n;i++){
  f[i] = 1;
  for(int j = 1;j < i;j++){
    if(a[i] > a[j])
      f[i] = max(f[i],f[j]+1);
  }
}

以i开头的最长连续上升子序列

for(int i = n;i;i--){
  f[i] = 1;
  for(int j = n;j > i;j--){
    if(a[i] < a[j])
      f[i] = max(f[i],f[j]+1);
  }
}

以i结尾的最长连续下降子序列

for(int i = 1;i <= n;i++){
  f[i] = 1;
  for(int j = 1;j <= n;j++){
    if(a[i] < a[j])
      f[i] = max(f[i],f[j]+1);
  }
}

以i开头的最长连续下降子序列

for(int i = n;i;i--){
  f[i] = 1;
  for(int j = n;j > i;j--){
    if(f[i] > f[j])
      f[i] = max(f[i],f[j]+1);
  }
}

注意到以i结尾时,写法变为从1到n

for(int i = 1;i <= n;i++)
for(int j = 1;j < i;j++)

以i开头时,写法则变为从n到1

for(int i = n;i;i--)
for(int j = n;j > i;j--);

求以i结尾最长上升子序列时,写法变为

if(a[i] > a[j])

求以i开头最长上升子序列时,写法变为

if(a[i] < a[j])

求以i结尾最长下降子序列时,写法变为

if(a[i] < a[j])

求以i开头最长下降子序列时,写法变为

if(a[i] > a[j])
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
const int N = 110;
int f[N],cnt[N],a[N];
int main(){
    int n;
    cin >> n;
    for(int i = 1;i <= n;i++) cin >> a[i];
    for(int i = 1;i <= n;i++){
        f[i] = 1;
        for(int j = 1;j < i;j++) if(a[j] < a[i]) f[i] = max(f[j]+1,f[i]);
        cnt[i] += f[i];
    }
    for(int i = n;i;i--){
        f[i] = 1;
        for(int j = n;j > i;j--) if(a[j] < a[i]) f[i] = max(f[j] + 1,f[i]);
        cnt[i] += f[i] -1 ;
        // cout << cnt[i] << " " ;
    }
    int res = 0x3f3f3f3f;
    for(int i= 1;i <= n;i++){
        // cout << cnt[i] << " " ;
        res = min(n-cnt[i],res);
    }
    cout << res << endl;
    return 0;
}
目录
相关文章
|
算法 安全 量子技术
【Python】蒙特卡洛模拟 | PRNG 伪随机数发生器 | 马特赛特旋转算法 | LCG 线性同余算法 | Python Random 模块
【Python】蒙特卡洛模拟 | PRNG 伪随机数发生器 | 马特赛特旋转算法 | LCG 线性同余算法 | Python Random 模块
863 0
|
存储 iOS开发 Windows
利用Dism修复系统步骤,以及dism找不到源文件解决方案
利用Dism修复系统步骤,以及dism找不到源文件解决方案
14666 0
利用Dism修复系统步骤,以及dism找不到源文件解决方案
|
敏捷开发 测试技术 BI
禅道:从安装到使用,一篇文章带你全面了解
禅道:从安装到使用,一篇文章带你全面了解
3336 3
|
XML 监控 负载均衡
Jacoco的覆盖率原理
JaCoCo(Java Code Coverage)是一种广泛使用的代码覆盖率工具,通过在字节码中插入探针(Probe)来收集覆盖率信息。
1011 6
Jacoco的覆盖率原理
|
监控 安全 数据可视化
开源的网络监控工具:Sniffnet,简单而有趣!
开源的网络监控工具:Sniffnet,简单而有趣!
1800 0
|
Linux Go iOS开发
安装 Wails
安装 Wails
520 0
|
算法 Java C语言
【数据结构】后缀(逆波兰)表达式的计算以及中缀转后缀的方法
【数据结构】后缀(逆波兰)表达式的计算以及中缀转后缀的方法
3106 1
|
机器学习/深度学习 人工智能 算法
【算法】最长公共子序列(C/C++)
【算法】最长公共子序列(C/C++)
|
弹性计算 Serverless 持续交付
聊聊如何把项目从Gitee部署到阿里云上
【7月更文挑战第11天】聊聊如何把项目从Gitee部署到阿里云上
713 1
|
存储 算法 安全
【C/C++ 数据结构 】从零开始实现哈希表:C++实践指南
【C/C++ 数据结构 】从零开始实现哈希表:C++实践指南
1802 0