(区间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 模块
690 0
|
存储 iOS开发 Windows
利用Dism修复系统步骤,以及dism找不到源文件解决方案
利用Dism修复系统步骤,以及dism找不到源文件解决方案
13555 0
利用Dism修复系统步骤,以及dism找不到源文件解决方案
|
Linux Go iOS开发
安装 Wails
安装 Wails
372 0
|
监控 安全 数据可视化
开源的网络监控工具:Sniffnet,简单而有趣!
开源的网络监控工具:Sniffnet,简单而有趣!
1597 0
|
算法 Java C语言
【数据结构】后缀(逆波兰)表达式的计算以及中缀转后缀的方法
【数据结构】后缀(逆波兰)表达式的计算以及中缀转后缀的方法
2037 1
|
测试技术 C++
【PTA】​L1-003 个位数统计​ (C++)
【PTA】​L1-003 个位数统计​ (C++)
238 0
【PTA】​L1-003 个位数统计​ (C++)
|
算法 Python
算法理论——回溯算法及剪枝优化
回溯法也可以叫做回溯搜索法,它是一种搜索的方式。
549 0
算法理论——回溯算法及剪枝优化
|
算法 关系型数据库 MySQL
Mysql为何建议使用自增id作主键,有什么优点
Mysql为何建议使用自增id作主键,有什么优点
1617 1
|
存储 安全 前端开发
什么是Java虚拟机(JVM),它的作用是什么?
什么是Java虚拟机(JVM),它的作用是什么?
经过两年努力,我终于进入腾讯(PCG事业群4面总结)
如果毕业就进了大厂,那你将得到业内大牛的指导,以及随处可见的技术碰撞。新技术的跟进也是非常快的,在这样的环境中,你的技术成长自然是非常快的。如果自己足够努力,用不了三年,你可能也将会跟他们水平差不多。