动态规划 dp02 最长非降子序列问题 c代码
先看下题目:
给定一个由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代码相关推荐
- 最长非降子序列(动态规划dp dynamic programming)
首先要理解一下什么叫做非降子序列 非降子序列,简单来说就是指给出一个数字序列,在不改变整体顺序的情况下摘出几个来组成一个子序列,这个序列满足从小到大的排序顺序. 所以,最长非降子序列,不难理解就是从这 ...
- 最长非降子序列 动态规划 java
1. 案例提出 给定一个由n个正整数组成的序列,从该序列中删除若干个整数,使剩下的整数组成非降子序列,求最长的非降子序列. 例如,由12个正整数组成的序列为: 48,16,45,47,52,46,36 ...
- 动态规划——最长非降子序列
前言 先分享一篇文章<动态规划:从新手到专家>,作者正是通过这篇文章来学习的.文中对动态规划的设计思想做了非常详细的介绍,并通过简单问题和复杂问题对动态规划的设计流程进行剖析,以下是作者和 ...
- 第1关:最长非降子序列(非连续)问题
方法一:使用栈的方式 // // main.cpp // step1 // // Created by ljpc on 2018/12/8. // Copyright ? 2018年 ljpc. Al ...
- 面试题:求最长非重复子序列
题目:求字符串的最长非重复子序列.比如字符串"dabaccdeff",它的最长非重复子序列为"dabcef" 这道题目与 面试题35:第一个只出现一次的字符 非 ...
- 【动态规划】最长公共上升子序列
问题 F: [动态规划]最长公共上升子序列 时间限制: 5 Sec 内存限制: 64 MB 提交: 34 解决: 9 [提交] [状态] [命题人:admin] 题目描述 研究发现,大猩猩的基因序 ...
- HDU2227(非降子序列的个数)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2227 题意:给定一个长度为n(n <= 100000)的整数序列,求其中的非降子序列的个数. 分析: ...
- 最长非下降子序列(O(nlogn))(offer收割)
题目 如题 思路 核心思想是,维护一个数组ends,它记录了长度为k的子序列的末尾元素的最小值.听起来很抽象,我们不妨手动演示一遍整个过程. 假设数组a={2,9,4,27,29,15,7 ...
- 动态规划(3):最长非递减子序列
题目 在一个数字序列中,找到一个最长的子序列(可以不连续),使得这个子序列是不下降(非 递减)的. 样例 输入 8 1 2 3 -9 3 9 0 11 输出 6 题解 最优子结构(举例):以3结尾的最 ...
最新文章
- python读取xml_python解析xml文件
- 【初码干货】关于.NET玩爬虫这些事
- (九)深入浅出TCPIP之网络同步异步
- oracle 数据结构部署,
- 不靠谱的副业,别碰!
- WIFI加密技术介绍
- java正则和python正则差距,在C/Java中处理正则表达式比在Python中快多少?
- 随手记_选方向读论文发论文相关
- java判断map是否为空_Java自定义Exception
- 人工智能-八数码问题-启发式搜索
- 关于虚拟机Ubuntu联网问题
- 图片转为PDF怎么弄
- Longhorn,企业级云原生容器分布式存储 - 监控(Prometheus+AlertManager+Grafana)
- gif原理+gifsicle压缩gif
- 《架构师修炼之道》读书笔记之五:换位思考
- 智能云时代,谁来守护我们的安全?
- Win10开启telnet功能
- 常见 Shell 指令
- 烟雨白银坨_SAP刘梦_新浪博客
- 祝福考研的兄弟姐妹们!
热门文章
- 信息安全系统设计基础第九周总结
- Macosx Setdns
- source tree 递归子模块_每日刷题3--漫谈二叉树的递归遍历
- 图片尺寸对分类迭代次数和准确率的影响
- 用神经网络的衰变假设理解神经网络的翻译行为
- c语言fopen函数打不开,[讨论]用fopen函数无法打开文件有哪几种情况
- cmd安装pip_离线情况下怎么安装numpy、pandas和matplotlib?一步一步教你
- 8.3 算法流程与评估-机器学习笔记-斯坦福吴恩达教授
- 猜想串scan的order
- 基础篇verilog-‘timescale的解释