当前位置: 首页 > news >正文

DP-最长上升子序列

题面:

样例:

思路:

遇到动态规划问题,我们照旧思考两部分,状态表示以及状态计算。这里我们f[N]表示以第i个数结尾的上升子序列的最大值。我们将f[N]划分为若干个部分,因为我们要用到递推思路想办法用前面的来表示这一个,所以我们自然而然地可以想到用上升子序列中的前一个数进行分类。前一个数是序列中的第一个数,第二个数以此类推直到第i-1个数。我们就可以得到状态计算方程。f[i]就可以分为这些部分的“和”然后求最大值。

代码:

#include<iostream>

using namespace std;

const int N = 1010;
int n;
int a[N];
int f[N];

int main(void)
{
    cin >> n;
    
    for(int i = 1;i <= n;i++) cin >> a[i],f[i] = 1;
    
    for(int i = 1;i <= n;i++)
        for(int j = 1;j < i;j++)
            if(a[j]<a[i]) f[i] = max(f[i],f[j]+1);
            
    int cnt;
    
    for(int i = 1;i <= n;i++) cnt = max(cnt,f[i]);
    
    cout << cnt << endl;
    
    return 0;
}

tips:

需要注意的是,我们划分的那些部分不一定是每一部分都有的,必须要满足前一个小于a[i]这个条件。其次我们在状态计算的时候,一定要加上1,因为前面的还有这个数它自身。

相关文章:

  • 【git】提交修改、回撤、回滚、Tag 操作讲解,与reset (--soft、--mixed、--hard) 的区别
  • sharpGL的openGL兼容性
  • Python的那些事第二十七篇:Python中的“数据魔法师”NumPy
  • 安利:外文文献翻译插件
  • Eclipse自动排版快捷键“按了没有用”的解决办法
  • 正则表达式–断言
  • 前端导出word文件,并包含导出Echarts图表等
  • 影刀RPA中级证书-Excel进阶-开票清单
  • 开放表格式和对象存储架构指南
  • MySQL系列之身份鉴别(安全)
  • 分巧克力(二分查找)
  • flutter在安卓模拟器上运行
  • ECMAScript6------数组扩展
  • 某手sig3-ios算法 Chomper黑盒调用
  • DeepSeek_部署
  • 单例模式【C++设计模式】
  • Python time模块和datatime模块的区别
  • 谷粒商城—分布式高级②.md
  • 文字识别软件cnocr学习笔记
  • AATWS: gnome下无敌的应用切换器
  • 居民被脱落的外墙瓦砖砸中致十级伤残,小区物业赔付16万元
  • 宝龙地产:委任中金国际为境外债务重组新的独家财务顾问
  • 央媒关注脑瘫女骑手:7年跑出7.3万多份单,努力撑起生活
  • 继加州后,美国又有11州起诉特朗普政府滥用关税政策“违法”
  • 湃书单|澎湃新闻编辑们在读的19本书:在工作中迷失
  • 网上销售假冒片仔癀和安宫牛黄丸,两人被判刑