一、最大连续子序列

1.题目叙述

对于一个数字序列A1A2A3...An,求出连续子序列的最大和,如对于序列-2,11,-4,13,-5,-2,其中的最大序列和是11+(-4)+13=20

2.动态规划解法

将问题拆分成子问题,即dp[i]表示以A[i]为结尾的子序列的最大和,最后对于这些dp数组找出最大值即可,状态转移方程为:

dp[i] = max{ dp[i-1] + A[i] }  状态dp[i]表示,当前以A【i】结尾的子序列的最大和3.方法一是经典算法,方法二是根据状态方程优化而来。

  1. #include<iostream>
  2. #include<algorithm>
  3. using namespace std;
  4. int maxSum1(int arr[],int n){
  5. int dp[10];
  6. int ans = INT32_MIN;
  7. dp[0] = arr[0];//初始化
  8. for(int i=1;i&lt;n;i++){
  9. dp[i] = max(dp[i-1]+arr[i], arr[i]);
  10. ans = max(ans,dp[i]);
  11. }
  12. return ans;
  13. }
  14. int maxSum2(int arr[],int n){
  15. int dp = arr[0];
  16. int m = arr[0];
  17. for(int i=1;i&lt;n;i++){
  18. if(dp&lt;0){
  19. dp = arr[i];
  20. }
  21. else dp+=arr[i];
  22. if(dp&gt;m){
  23. m = dp;
  24. }
  25. }
  26. return m;
  27. }
  28. int main(){
  29. //-2,6,-1,5,4,-7,2,3
  30. //dp[i] = max{dp[i-1]+A[i], A[i]}
  31. int arr[8]={-2,6,-1,5,4,-7,2,3};
  32. cout<<"algorithm 1:" <<maxSum1(arr,8)<<endl;
  33. cout<<"algorithm 2: "<<maxSum2(arr,8)<<endl;
  34. return 0;
  35. }

二、最长公共子序列(可以不连续)

状态转移函数:

  1. if(a == b)
  2. dp[i][j] = dp[i-1][j-1] + 1;
  3. else{
  4. dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
  5. }
  1. for(int i=1; i<=n1; i++){
  2. for(int j=1; j<=n2; j++){
  3. char a = text1[i-1];
  4. char b = text2[j-1];
  5. if(a == b)
  6. dp[i][j] = dp[i-1][j-1] + 1;
  7. else{
  8. dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
  9. }
  10. }
  11. }

观察可以发现空间可以使用两个一维数组即可

  1. for(int i=1; i<=n1; i++){
  2. for(int j=1; j<=n2; j++){
  3. char a = text1[i-1];
  4. char b = text2[j-1];
  5. if(a == b)
  6. dp[i%2][j] = dp[(i+1)%2][j-1] + 1;
  7. else{
  8. dp[i%2][j] = max(dp[(i+1) % 2][j], dp[i][j-1]);
  9. }
  10. }
  11. }

三、最长单调递增序列

状态转移方程:

dp[i]=max(dp[j])+1,其中0≤j<i且num[j]<num[i]

  1. class Solution {
  2. public:
  3. int lengthOfLIS(vector<int>& nums) {
  4. vector<int> dp(nums.size());
  5. dp[0] = 1;
  6. int ans = 1;
  7. for(int i=1; i<nums.size(); i++){
  8. int cur_max = 0;
  9. for(int j=0; j<i; j++){
  10. if(nums[j] < nums[i])
  11. cur_max = max(cur_max, dp[j]);
  12. }
  13. dp[i] = cur_max + 1;
  14. cout<<dp[i]<<" ";
  15. ans = max(ans, dp[i]);
  16. }
  17. return ans;
  18. }
  19. };

时间复杂度\(O(n^2)\)

也可以使用贪心加二分的方法,基本思路举个例子就比较容易明白,比如序列是78912345,前三个遍历完以后tail是789,这时候遍历到1,就得把1放到合适的位置(使用二分),于是在tail二分查找1的位置,变成了189(如果序列在此时结束,因为res不变,所以依旧输出3),再遍历到2成为129,然后是123直到12345 .

动态规划DP入门问题----最大连续子序列,最长不下降子序列(可以不连续),最长公共子序列的更多相关文章

  1. 《 动态规划_ 入门_最大连续子序列_HDU_1003 》

    题目描述: Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  2. 动态规划DP入门

    百度百科↓ 动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法.20世纪50年代初美国数学家R.E.Bellman ...

  3. 算法导论-动态规划(最长公共子序列问题LCS)-C++实现

    首先定义一个给定序列的子序列,就是将给定序列中零个或多个元素去掉之后得到的结果,其形式化定义如下:给定一个序列X = <x1,x2 ,..., xm>,另一个序列Z =<z1,z2  ...

  4. 【线型DP模板】最上上升子序列(LIS),最长公共子序列(LCS),最长公共上升子序列(LCIS)

    BEGIN LIS: 一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序 ...

  5. 最长公共子序列(LCS)、最长递增子序列(LIS)、最长递增公共子序列(LICS)

    最长公共子序列(LCS) [问题] 求两字符序列的最长公共字符子序列 问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字 ...

  6. 最长公共子序列(LCS)问题 Longest Common Subsequence 与最长公告字串 longest common substr

    问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X=“x0,x1,…,xm-1”,序列Y=“y0,y1,…,yk ...

  7. 动态规划法(十)最长公共子序列(LCS)问题

    问题介绍   给定一个序列\(X=<x_1,x_2,....,x_m>\),另一个序列\(Z=<z_1,z_2,....,z_k>\)满足如下条件时称为X的子序列:存在一个严格 ...

  8. 算法实践--最长公共子序列(Longest Common Subsquence)

    什么是最长公共子序列 X=ACCG Y=CCAGCA 长度为1的公共子序列: {A} {C} {G} 长度为2的公共子序列:{AC} {CC} {CG} {AG} 长度为3的公共子序列:{ACG} 长 ...

  9. noj最长公共子序列

    1041.最长公共子序列 时限:1000ms 内存限制:200000K  总时限:3000ms 描述 一个给定序列的子序列是在该序列中删去若干元素后得到的序列.确切地说,若给定序列X=<x1, ...

  10. dp经典问题-最大连续子序列和 hdu1003

    题目描述: 这道题我先后做过三遍,结果每一遍都没有做出来.今天再仔仔细细的研究了一下,才发现用动态规划更好理解. 关于求最大连续子序列和的博文转载如下:https://www.cnblogs.com/ ...

随机推荐

  1. cesium 學習計劃

    上篇已经将cesium环境搭建完成,并且服务启动完成,进去后主要浏览 documents 文档和Sandcastle 示例. 学习计划:沙盒示例学习一遍,每个示例中的查看对应代码接口. 学习cesiu ...

  2. Qt编译问题之FTH (7156) Fault tolerant heap shim applied to current process

    有时候Qt编译会出现FTH: (7156): *** Fault tolerant heap shim applied to current process. This is usually due ...

  3. JMeter MD5加密 默认小写 转换为大写

    出处:https://www.cnblogs.com/scholars-xian/p/11718854.html 使用内置函数加密 1)使用 ${__MD5(123,)} 进行MD5加密(32位小写) ...

  4. axis2 WebService 请求参数xml格式

    方法定义 public class GetBillInfoService { public String getBillList(String xmlData, String temp ){} 传入接 ...

  5. 任意的形如 z = F(x,y)的曲面生成与显示---基于OpenGL Core Profile

    运行结果:   (圆锥面) (抛物面) (马鞍面) 其中的做法是:从顶部看上去就是一个平面网格.每个点的 z.x的位置都是程序细分出来的(指定起始.结束.步长).比较固定.但高度 y 的计算使用 用户 ...

  6. Laravel安装第一步:Windows 10 上laravel下载与安装需要注意。

    1.下载了laravel,查看composer.json文件,搞清楚它需要的PHP版本 2.不要用 composer install !!! 用  composer -vvv install   这样 ...

  7. java中的4种引用和GC Roots

    https://juejin.im/post/5d06de9d51882559ee6f4212?utm_source=gold_browser_extension 1.首先,四种引用如下: Final ...

  8. 转载:Windows Server查看W3SVC IIS服务器中对应的网站日志

    W3SVC日志文件夹中序号的含义,格式就是W3SVC+网站ID 如果没有自定义站点的日志路径,日志默认的路径是C:\inetpub\logs\LogFiles\ 基本上每个网站存放日志的文件夹名称都是 ...

  9. ADOStoredProc动态调用存储过程

    有些用ADOStoredProc进行操作时,要动态创建输入输出参数,一定要用 ADOStoredProc1.Parameters.Refresh;将参数进行刷新一下.

  10. 非侵入式入侵 —— Web缓存污染与请求走私

    作者:vivo 互联网安全团队- Gui Mingcheng 本文介绍了两种攻击者无需直接接触服务端即可攻击和影响用户行为的安全漏洞 -- Web缓存污染与请求走私.Web缓存污染旨在通过攻击者向缓存 ...