动态规划小示例
来源:互联网 发布:程序员面试刷题 编辑:程序博客网 时间:2024/04/30 11:23
动态规划算法一直是我最恐惧的算法,因为大学里整了一年也没明白这个算法,导致和很多机会失之交臂。工作多年来也没敢再去碰,今天花了点时间再看了下,也算了却自己的一桩心愿。
需要解决的问题是寻找最长递增子序列,ACM里面这个问题衍生了无数题目,万变不离其宗,很多题目连代码都一样。
有一个序列,比如3,5,1,4,8,6 最长递增子序列就是从中找一串数字,顺序不能变,可以跳着找,找到最长的那串。比如3,5,8是一串递增子序列,1,4,6也是递增子序列。这个例子中最长的有多个,长度为3.
这题目可以用动态规划来解决。首先我们考虑只有一个值的数字串,比如3,它的最长子序列就是1了,再在这个数字串中加5,变成3,5数字串,由于5>3,意味着以5结尾的字符串长度不会比以3结尾的字符串长度小,所以最长子序列为(以3结尾的字符串长度)L(0)+1,,当数字串变成3,5,1时,由于1<3且1<5,所以1不能和任何之前的数字组成序列,所以1值的子序列为1 。当数字串为3,5,1,4时,我们知道3<4,意味着以4为结尾的字符串长度不会比以3为结尾的字符串长度小,则在以3为结尾的字符串长度L(0)上加1,以3为结尾的字符串长度为1,则以4为结尾的字符串长度最少为2 。以此类推。示例如下:
下标: L(0) L(1) L(2) L(3) L(4) L(5)
值: 3 5 1 4 8 6
最大长度: 1 2 1 2 3 3
L(0)+1 L(0)+1 L(1)+1 L(1)+1
代码如下:
#include<iostream>using namespace std;int main(){ int arr[]={5,7,3,9,4,1,8,11,13,18,15}; int longest[11]={1}; for( int j=1; j<11; j++) for( int i=0; i<j; i++) { if( arr[j]>arr[i] && longest[j]<longest[i]+1 ) longest[j]=longest[i]+1; } int maxNum=0; for( int i=0; i<11; i++ ) { if( maxNum < longest[i] ) maxNum=longest[i]; } cout<<maxNum<<endl;}
- 动态规划小示例
- 动态规划示例
- 动态规划示例二
- 动态规划示例三
- 动态规划示例四
- 动态规划示例五
- 动态规划小题目;
- 动态规划小例子
- 动态规划小入门
- 动态规划小练习
- 动态规划小入门
- 看动态规划小感
- [LeetCode63]Unique pathII动态规划解题示例
- 树型动态规划小练
- 动态规划-开心的小明
- 动态规划——小胖办证
- |洛谷|动态规划|P1164 小A点菜
- 小白学习动态规划(1)
- C语言中的变量
- 多线程下SOCKET编程
- android安装sdk详解
- UART0串口编程系列(四)UC/OS下的串口发送任务
- FileUtil
- 动态规划小示例
- springMVC整合JAXB
- myeclipse 的中文字体变小解决
- 航天科工“大数据处理技术—基于Hadoop的实战”圆满完成!
- 移动支付交易规模增长率高达707%,安全面临考验
- IOS申请颁发证书、图文详解
- sqlserver 发送邮件, Foxmail 乱码问题
- C语言之结构体
- cstring 字符串连接不起来的情况