C语言实现最长递增子序列问题的解决方法_C 语言

本文实例展示了C语言实现最长递增子序列问题的解决方法。分享给大家供大家参考。具体方法如下:

问题描述:

给定一个序列,找出其最长递增子序列长度。

比如 输入 1 3 7 5

输出 3

算法解决思路:

利用动态规划的思想,以序列的每个点最为最右端,找出每个点作为最右端时的子序列长度的最大值,即问题的求解。因此,在计算前面的每个点的时候,将其结果保存下来,后面的点与前面的点的数值进行比较,如果大,则在其长度基础上加1,并且找出所有可能情况下最长的保存为当前点的长度。形成递归。

具体实现代码如下:

#include "stdio.h"
#include "stdlib.h"
#define MAXDATA 10000
int main(){
  int data[MAXDATA]; /*数据序列*/
  int lgs[MAXDATA];  /*最长子序列长度*/
  int n,temp,k; /*n 序列长度 temp 子序列长度中间变量 */
  scanf("%d",&n);
  if(n>10000){
     return 0;
  }
  for(int i=0;i<n;i++){
    scanf("%d",&data[i]);
  }
  for(int i=0;i<MAXDATA;i++){
    lgs[i]=1;  /*给每一个序列点作为右端时的最大序列长度为1*/
  }
  for(int i=1;i<n;i++){
    temp=1;
    for(int j=0;j<i;j++){ /*与其前面的每一个进行比较*/
      if(data[i]>data[j]){ /*如果数据比前面的某一个的值大*/
        if(lgs[i]+lgs[j]>temp){ /*找出该点的最大子序列长度*/
          temp=lgs[i]+lgs[j];
        }
      }
    }
    lgs[i]=temp;
  }
  temp=lgs[0];
  for(int i=1;i<n;i++){
    if(lgs[i]>temp){
      temp=lgs[i];
    }
  }
  printf("%d",temp);
  system("pause");
}

希望本文所述对大家C程序算法设计的学习有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c语言
, 问题
, 子序列
最长递增
最长递增子序列 c语言、最长公共子序列c语言、最长上升子序列c语言、最长递增子序列、最长单调递增子序列,以便于您获取更多的相关知识。

时间: 2024-08-03 10:16:44

C语言实现最长递增子序列问题的解决方法_C 语言的相关文章

求数组中最长递增子序列的解决方法_C 语言

存储扩展算法n2编程c 写一个时间复杂度尽可能低的程序,求一个一维数组(N个元素)中的最长递增子序列的长度.例如:在序列1,-1,2,-3,4,-5,6,-7中,其最长的递增子序列为1,2,4,6 或者 -1,2,4,6.(编程之美P198-202)分析与解法根据题目的要求,求一维数组中的最长递增子序列,也就是找一个标号的序列b[0],b[1],-,b[m](0 <= b[0] < b[1] < - < b[m] < N),使得array[b[0]]<array[b[1

C语言按关键字搜索文件夹中文件的方法_C 语言

本文实例讲述了C语言按关键字搜索文件夹中文件的方法.分享给大家供大家参考.具体实现方法如下: 方法1: #include<iostream> #include<string> #include<io.h> using namespace std; void filesearch(string path,string mode) { struct _finddata_t filefind; if(path[path.size()-1]=='\\') path.resize

C语言实现在windows服务中新建进程的方法_C 语言

本文实例讲述了C语言实现在windows服务中新建进程的方法.分享给大家供大家参考.具体如下: 运行环境:visual stdio 2008 文件名:testService.c #include <windows.h> #include <stdio.h> #include <time.h> #include <tchar.h> HANDLE hMutex; SERVICE_STATUS ServiceStatus; SERVICE_STATUS_HANDL

C语言中结构体(struct)的几种初始化方法_C 语言

本文给大家总结的struct数据有3种初始化方法      1.顺序      2.C风格的乱序      3.C++风格的乱序 下面通过示例代码详细介绍这三种初始化方法. 1)顺序 这种方法很常见,在一般的介绍C的书中都有介绍.顺序初始化的特点是: 按照成员定义的顺序,从前到后逐个初始化:允许只初始化部分成员:在被初始化的成员之前,不能有未初始化的成员. 示例: struct User oneUser = {10, "Lucy", "/home/Lucy"}; 2

错误:sem_union的存储大小未知问题的解决方法_C 语言

今天在编译代码的时候提示 错误: 'sem_union'的存储大小未知 问题原因:在新版2.6内核中关于union sem_union 这个联合体已经被注释了,需要自己写这个联合体. 解决方案:在C文件中先定义: union semun { int val; struct semid_ds *buf; unsigned short *array; }sem_union; 随后编译时它就能找到预先定义好的sem_union联合体了. Linux下编译时出现的错误及解决方法 (1)由于是Linux新

16种C语言编译警告(Warning)类型的解决方法_C 语言

当编译程序发现程序中某个地方有疑问,可能有问题时就会给出一个警告信息.警告信息可能意味着程序中隐含的大错误,也可能确实没有问题.对于警告的正确处理方式应该是:尽可能地消除之.对于编译程序给出的每个警告都应该仔细分析,看看是否真的有问题.只有那些确实无问题的警告才能放下不管. 说明: 由于编译的警告各种各样,根本不可以一一罗列出来,下面只是列举出比较典型的一些警告,还有一些警告,大家只要根据字面意思,就可以很快的查找出来,并解决之. 类型1:显示:warning: implicit declara

Eclipse对printf()不能输出到控制台的快速解决方法_C 语言

Eclipse的控制台经常对C语言的printf不能正常输出,究其原因,就是因为输出内容停留在了输出缓冲区里,而没有及时输出到控制台界面,解决的方法很简单:在每个printf后加上fflush(stdout)即可,或者,像我一样,把printf用一个宏封装一下: 复制代码 代码如下: #define OUTPUT_STR(str) do{printf(str);fflush(stdout);}while(0)

C语言中对字母进行大小写转换的简单方法_C 语言

C语言tolower()函数:将大写字母转换为小写字母头文件: #include <ctype.h> 定义函数: int toupper(int c); 函数说明:若参数 c 为小写字母则将该对应的大写字母返回. 返回值:返回转换后的大写字母,若不须转换则将参数c 值返回. 范例:将s 字符串内的小写字母转换成大写字母. #include <ctype.h> main(){ char s[] = "aBcDeFgH12345;!#$"; int i; print

使用C语言求二叉树结点的最低公共祖先的方法_C 语言

算法分析 我们直接来分析O(n)的算法. 比如求节点F和节点H的最低公共祖先,先求出从根节点A到F的路径,再求出A到H的路径,那么最后一个相同的节点就是最低公共祖先.A->B->D->F和A->B->E->H,最后相同的节点事B,所以最低公共祖先是B节点.求根节点到指定节点的算法先前已经更新过了,复杂度是O(n),所以总的时间复杂度是O(n). 条件细化: (1)树如果是二叉树,而且是二叉排序树.              这中条件下可以使用二叉排序树的搜索功能找到最低