IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python解决最长有序子序列 -> 正文阅读

[Python知识库]python解决最长有序子序列

本博文源于《程序设计竞赛入门》,本文旨在解决最长有序子序列,最长有序子序列是一个动态规划问题。文章共分为:①原题再现 ②测试效果 ③源码思路分析 ④源码完整。

一、原题再现

对于给定一个数字序列( a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1?,a2?,...,an?),如果满足 a 1 < a 2 < . . . < a n a_1<a_2<...<a_n a1?<a2?<...<an?,则称该序列是有序的。若在序列 ( a 1 , a 2 , . . . , a n ) (a_1,a_2,...,a_n) (a1?,a2?,...,an?)中删除若干元素得到的子序列是有序的,则该子序列为一个有序子序列。有序子序列中长度最大的即为最长有序子序列。
例如,(1,3,5)、(3,5,8)(1,3,5,9)等都是序列(1,7,3,5,9,4,8)的有序子序列;而(1,3,5,9)(1,3,5,8)(1,3,4,8)都是序列(1,7,3,5,9,4,8)的一个最长有序子序列,长度为4.

Input

首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据第一行输入一个整数n( 1 ≤ n ≤ 100 1\le{n}\le{100} 1n100),第二行输入n个整数,数据范围都在[0,10 000],数据之间以一个空格分隔

Output

对于每组测试,输出n个整数所构成序列的最长有序子序列的长度。每组测试的输出之间留一个空行。

Input
1
7
1 7 3 5 9 4 8

Output
4

二、测试效果

在这里插入图片描述

三、源码思路分析

def los(v):
    n = len(v) 
    f = [1] * n 
    for i in range(1,n): 
        for j in range(0,i): 
            if v[i] > v[j] and f[j] + 1 > f[i]: 
                f[i] = f[j] + 1
    return max(f)

设n个整数存在v列表中,DP的四要素如下:

  1. 状态:以f(i)表达,表示以下标为i的元素(v[i])为尾元素的最长上升子序列的长度。
  2. 转移方程:f(i)=max(f(j)+1,f(i)),其中 o ≤ j < i 且 v [ i ] > v [ j ] o\le{j}<i且v[i]>v[j] oj<iv[i]>v[j],寻找以某个 v [ j ] ( 0 ≤ j < i ) v[j](0\le{j}<i) v[j](0j<i)结尾的最长的上升子序列,然后将v[i]添加到子序列的尾部,构成最长的有序子序列(长度增1)
  3. 初值:f(i)=1,其中 0 ≤ i < n 0\le{i}<n 0i<n,每个数本身可以构成长度为1的上升序列
  4. 结果:max(f(i)),其中 0 ≤ i < n 0\le{i}<n 0i<n

四、完整源码

def los(v):
    n = len(v) 
    f = [1] * n 
    for i in range(1,n): 
        for j in range(0,i):
            if v[i] > v[j] and f[j] + 1 > f[i]: 
                f[i] = f[j] + 1
    return max(f)

if __name__ == '__main__':
    T = int(input())
    for t in range(T):
        n = int(input())
        a = list(map(int,input().split()))
        if t>0:
            print()
        print(los(a))
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-08-04 11:09:46  更:2021-08-04 11:11:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 3:21:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码