最长上升子列~

本文介绍了一个寻找给定序列中最长上升子序列长度的算法实现。通过动态规划的方法,该算法能够有效地找出序列中最长上升子序列的具体长度。

一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序列(ai1, ai2, …, aiK),这里1 <= i1 < i2 < … < iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8).

你的任务,就是对于给定的序列,求出最长上升子序列的长度。

这道题有很多的变形形式,以后会慢慢的写出来
现在先给出一个通解吧

#include<stdio.h>
#define N 100
int a[N];
int main()
{
    int n;
    scanf("%d",&n);
    int b[N];
    int t=n,i,j,k,l;
    while(t--)
    {
            scanf("%d",&a[n-t-1]);
            b[t]=1;
    }
    for(i=0;i<n;i++)
    {
            k=1;
            for(j=0;j<i;j++)
            {
                   if(a[j]<a[i]&&b[j]>=k)
                   {
                           k=b[j];
                           b[i]=b[j]+1;
                   }
            }
    }
    l=0;
    for(i=0;i<n;i++)
    {
        if(b[i]>l)
                    {l=b[i];
        k=i;}

    }
    printf("%d",l);
    return 0;
}
个人感觉还挺简单的
### 关于洛谷 B3797 的题目解析与编程实现 目前提供的引用材料中并未直接提及洛谷 B3797 这道题目的具体信息[^1]。然而,可以通过分析洛谷平台上的其他题目及其分类来推测该题可能涉及的知识点和解法。 #### 可能的题目背景 根据洛谷平台上常见的题目分类方式,B系通常属于基础练习题,而编号接近 B3637(最长上升)的题目可能会涉及到动态规划或其他经典算法[^3]。因此,可以合理猜测洛谷 B3797 是一道关于 **数组操作** 或者 **字符串处理** 类型的基础或中级难度题目。 #### 解决方案框架 如果假设此题为典型的数组或字符串问题,则解决方案可以从以下几个方面入手: 1. **输入输出理解**: 明确题目中的输入格式以及期望得到的结果形式。 2. **核心逻辑设计**: 基于题目需求构建相应的计算模型或者遍历策略。 3. **边界条件考虑**: 对极端情况下的行为进行定义,比如空数组、单元素等情况。 4. **优化空间复杂度**: 如果存在多次查询的需求,尝试预处理减少重复运算的时间消耗。 下面给出一段通用性的伪代码作为参考模板: ```python def solve_problem(input_data): result = [] # 初始化必要的参数 n = len(input_data) dp_table = [0]*n # 主循环体执行特定业务逻辑 for i in range(n): max_val = 0 for j in range(i): if condition_met(input_data[j], input_data[i]): max_val = max(max_val, dp_table[j]) dp_table[i] = max_val + transformation_function(input_data[i]) final_answer = compute_final_result(dp_table) return final_answer ``` 上述代码片段展示了如何通过双重嵌套循环解决问题,并利用`dp_table`存储中间状态以便后续使用。 #### 示例程序 (假定目标是最长递增) 考虑到之前提到过的相似案例——即求解最长递增(LIS),这里提供一个具体的Python实现版本供学习交流之用: ```python from bisect import bisect_left def length_of_LIS(nums): tails = [] for num in nums: pos = bisect_left(tails, num) if pos == len(tails): tails.append(num) else: tails[pos] = num return len(tails) # 测试数据集 test_cases = [ ([10,9,2,5,3,7,101,18], 4), ([0,1,0,3,2,3], 4), ([7,7,7,7,7,7,7], 1) ] for seq, expected_len in test_cases: actual_len = length_of_LIS(seq) print(f"For sequence {seq}, the Length of LIS is {actual_len} ({'Correct' if actual_len==expected_len else 'Incorrect'})") ``` 以上脚本采用二分查找方法加速寻找合适位置的过程,在保持较低时间复杂度的同时也兼顾了可读性和扩展性。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值