先看下题目:

给定一个由n个正整数组成的序列,从该序列中删除若干个整数,使剩下的整数组成非降子序列,求
最长的非降子序列。
例如,由12个正整数组成的序列为:48,16,45,47,52,46,36,28,46,69,14,42
请在序列中删除若干项,使剩下的项为非降(即后面的项不小于前面的项)序列,剩下的非降序列
最多为多少项?

这道题第一次做是会做的,刷了两天动态规划类题目,第二次做的时候,不会了 ( ̄_, ̄ ),难道dp类题目刷的不够多?

我们知道,动态规划类题目通常分为三个步骤求解:

1. 分阶段。

2. 状态迁移方程。

3. 求取最优解。

第一次做思考了一下就想到方案了,第二次做的时候没思考就想着套动态规划的解题过程,结果把自己套没了...... 看来解决问题不能套公式,灵活处理最重要。

对于这套题目,设数组a[n], 假设M[i]表示从i~n的最长非降数列长度,边界情况是m[n] = 1;从后往前遍历,求m[i],对于任意一个j, i < j < n;

如果a[i] <= a[j],则m[i] = m[j] + 1; 遍历[i+1, n],找到最大的m[i]即可。

状态迁移方程得到了,求取最优解序列的时候,遍历m[i],找到最大值i,顺着i打印即可。保持后续的打印数字m[i]递减。

这道题的c代码:

/**  最长非降子序列*  *  m[i] = MAX(m[j]) + 1; a[i] > a[j] && j < i;*/#include <stdio.h>
#include <time.h>
#include <stdlib.h>#define MAX(a, b) ((a) > (b) ? (a) : (b))void main()
{int a[30] = {0}, n, i,j,k,max,m[30] = {0}, c[30];printf("input total numbers :"); scanf("%d", &n);if (n > 30){printf("invalid number\n");return;}//随机生成一些数字srand(time(NULL));for (i = 0; i < n; i++)a[i] = rand()%20 + 1;printf("无序数列为:");for (i = 0; i < n; i++)printf("%d ", a[i]);printf("\n");   //边界初始化m[n-1] = 1;c[n-1] = n-1;//状态递推for (i = n- 2; i >= 0; i--){m[i] = 1;c[i] = i;for (j = n - 1; j > i; j--){if (a[i] <= a[j]){if (m[i] < m[j] + 1){m[i] = m[j] + 1;   c[i] = j;}}    }}//打印最优值max = 0;for (i = 0; i < n; i++){    //printf("%d ", m[i]);if (m[i] > max){max = m[i];k = i;}}    printf("最长非降子数列长度为:%d\n", max);while (c[k] != k){printf("%d ", a[k]);k = c[k];}printf("%d \n",a[k]);return;
}

参考资料:

1. 数据结构 : C语言版/ 严蔚敏,吴伟民编著

=============================================================================================

Linux应用程序、内核、驱动开发交流讨论群(745510310),感兴趣的同学可以加群讨论、交流、资料查找等,前进的道路上,你不是一个人奥^_^。

动态规划 dp02 最长非降子序列问题 c代码相关推荐

  1. 最长非降子序列(动态规划dp dynamic programming)

    首先要理解一下什么叫做非降子序列 非降子序列,简单来说就是指给出一个数字序列,在不改变整体顺序的情况下摘出几个来组成一个子序列,这个序列满足从小到大的排序顺序. 所以,最长非降子序列,不难理解就是从这 ...

  2. 最长非降子序列 动态规划 java

    1. 案例提出 给定一个由n个正整数组成的序列,从该序列中删除若干个整数,使剩下的整数组成非降子序列,求最长的非降子序列. 例如,由12个正整数组成的序列为: 48,16,45,47,52,46,36 ...

  3. 动态规划——最长非降子序列

    前言 先分享一篇文章<动态规划:从新手到专家>,作者正是通过这篇文章来学习的.文中对动态规划的设计思想做了非常详细的介绍,并通过简单问题和复杂问题对动态规划的设计流程进行剖析,以下是作者和 ...

  4. 第1关:最长非降子序列(非连续)问题

    方法一:使用栈的方式 // // main.cpp // step1 // // Created by ljpc on 2018/12/8. // Copyright ? 2018年 ljpc. Al ...

  5. 面试题:求最长非重复子序列

    题目:求字符串的最长非重复子序列.比如字符串"dabaccdeff",它的最长非重复子序列为"dabcef" 这道题目与 面试题35:第一个只出现一次的字符 非 ...

  6. 【动态规划】最长公共上升子序列

    问题 F: [动态规划]最长公共上升子序列 时间限制: 5 Sec  内存限制: 64 MB 提交: 34  解决: 9 [提交] [状态] [命题人:admin] 题目描述 研究发现,大猩猩的基因序 ...

  7. HDU2227(非降子序列的个数)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2227 题意:给定一个长度为n(n <= 100000)的整数序列,求其中的非降子序列的个数. 分析: ...

  8. 最长非下降子序列(O(nlogn))(offer收割)

    题目   如题 思路   核心思想是,维护一个数组ends,它记录了长度为k的子序列的末尾元素的最小值.听起来很抽象,我们不妨手动演示一遍整个过程.   假设数组a={2,9,4,27,29,15,7 ...

  9. 动态规划(3):最长非递减子序列

    题目 在一个数字序列中,找到一个最长的子序列(可以不连续),使得这个子序列是不下降(非 递减)的. 样例 输入 8 1 2 3 -9 3 9 0 11 输出 6 题解 最优子结构(举例):以3结尾的最 ...

最新文章

  1. python读取xml_python解析xml文件
  2. 【初码干货】关于.NET玩爬虫这些事
  3. (九)深入浅出TCPIP之网络同步异步
  4. oracle 数据结构部署,
  5. 不靠谱的副业,别碰!
  6. WIFI加密技术介绍
  7. java正则和python正则差距,在C/Java中处理正则表达式比在Python中快多少?
  8. 随手记_选方向读论文发论文相关
  9. java判断map是否为空_Java自定义Exception
  10. 人工智能-八数码问题-启发式搜索
  11. 关于虚拟机Ubuntu联网问题
  12. 图片转为PDF怎么弄
  13. Longhorn,企业级云原生容器分布式存储 - 监控(Prometheus+AlertManager+Grafana)
  14. gif原理+gifsicle压缩gif
  15. 《架构师修炼之道》读书笔记之五:换位思考
  16. 智能云时代,谁来守护我们的安全?
  17. Win10开启telnet功能
  18. 常见 Shell 指令
  19. 烟雨白银坨_SAP刘梦_新浪博客
  20. 祝福考研的兄弟姐妹们!

热门文章

  1. 信息安全系统设计基础第九周总结
  2. Macosx Setdns
  3. source tree 递归子模块_每日刷题3--漫谈二叉树的递归遍历
  4. 图片尺寸对分类迭代次数和准确率的影响
  5. 用神经网络的衰变假设理解神经网络的翻译行为
  6. c语言fopen函数打不开,[讨论]用fopen函数无法打开文件有哪几种情况
  7. cmd安装pip_离线情况下怎么安装numpy、pandas和matplotlib?一步一步教你
  8. 8.3 算法流程与评估-机器学习笔记-斯坦福吴恩达教授
  9. 猜想串scan的order
  10. 基础篇verilog-‘timescale的解释