我一定要把动态规划搞定!!!

0、动态规划必备知识:

http://www.hawstein.com/posts/dp-novice-to-advanced.html

1、最长非降子序列的长度

(这是属于一维动态规划的问题)

题目:一个序列有N个数:A[1],A[2],…,A[N],求出最长非降子序列的长度。

思路:dp[i]表示前i个数中以A[i]结尾的最长非降子序列的长度;想要求dp[i],就把i前面的各个子序列中, 最后一个数不大于A[i]的序列长度加1,然后取出最大的长度即为dp[i]。最有数组dp[]中最大的数,即为最长非降子序列的长度。

代码:

import java.util.Scanner;public class Solution {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while(sc.hasNext()){int n = sc.nextInt();int[] A = new int[n];for(int i=0; i<n; i++){A[i] = sc.nextInt();}int result = 1;//dp[i]表示前i个数中以A[i]结尾的最长非降子序列的长度int[] dp = new int[n];for(int i=0; i<n; i++){dp[i] = 1;//把i前面的各个子序列中, 最后一个数不大于A[i]的序列长度加1,然后取出最大的长度即为dp[i]for(int j=0; j<i; j++){if(A[j]<A[i]){dp[i] = Math.max(dp[i], dp[j]+1);}}result = Math.max(result, dp[i]);}System.out.println(result);}}}

2、跳石板

思路:https://www.nowcoder.com/questionTerminal/4284c8f466814870bae7799a07d49ec8

代码:

import java.util.Scanner;public class Solution {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while(sc.hasNext()){int N = sc.nextInt();int M = sc.nextInt();int[] dp = new int[100001];for(int i=N; i<=M; i++){dp[i] = Integer.MAX_VALUE;      //表示不可到达}dp[N] = 0;for(int i=N; i<M; i++){if(dp[i]==Integer.MAX_VALUE){continue;}//计算约数for(int j=2; j*j<=i; j++){if(i%j==0){if((i+j)<=M){dp[i+j] = Math.min(dp[i+j], dp[i]+1);}if((i+i/j)<=M){dp[i+i/j] = Math.min(dp[i+i/j], dp[i]+1);}}}}int result = -1;if(dp[M]!=Integer.MAX_VALUE){result = dp[M];}System.out.println(result);}}}

3、直方图包含的最大面积


(参考: http://blog.csdn.net/li563868273/article/details/51121169)

代码:

public int countArea(int[] A, int n) {int[][] dp = new int[n][n];//初始值for(int i=0; i<n; i++){dp[i][i] = A[i];}for(int k=1; k<n; k++){for(int i=0; (i+k)<n; i++){//得到该区间的最小值int min = A[i];for(int j=i; j<=(i+k); j++){min = ((A[j]<min)?A[j]:min);}//比较3种情况,得到最大值dp[i][i+k] = Math.max(dp[i+1][i+k], dp[i][i+k-1]);dp[i][i+k] = Math.max(min*(k+1), dp[i][i+k]);}}return dp[0][n-1];}

4、路径问题

思路:(参考“必备知识”中的二维DP问题)

代码:

public int countPath(int[][] map, int n, int m) {int startX = 0;int startY = 0;int endX = 0;int endY = 0;for(int i=0; i<n; i++){for(int j=0; j<m; j++){if(map[i][j] == 1){startX = j;startY = i;}else if(map[i][j] == 2){endX = j;endY = i;}}}//确定方向 int dirX = (startX<endX ? 1 : -1);int dirY = (startY<endY ? 1 : -1);int[][] count = new int[n][m];count[startY][startX] = 1;//确定竖边界的初始值for(int i=startY+dirY; i!=(endY+dirY); i+=dirY){if(map[i][startX]==-1){count[i][startX] = 0;}else{count[i][startX] = count[i-dirY][startX];  }}//确定横边界的初始值 for(int j=startX+dirX; j!=(endX+dirX); j+=dirX){if(map[startY][j]==-1){count[startY][j] = -1;}else{count[startY][j] = count[startY][j-dirX];}}for(int i=startY+dirY; i!=(endY+dirY); i+=dirY){for(int j=startX+dirX; j!=(endX+dirX); j+=dirX){if(map[i][j]==-1){count[i][j] = 0;}else{count[i][j] = count[i-dirY][j] + count[i][j-dirX];}}}return count[endY][endX];}

5、合唱团


题目来源:网易2017
https://www.nowcoder.com/practice/661c49118ca241909add3a11c96408c8?tpId=85&tqId=29830&tPage=1&rp=1&ru=/ta/2017test&qru=/ta/2017test/question-ranking

解题思路:
http://blog.csdn.net/fcxxzux/article/details/52138964


import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while(sc.hasNext()){int n = sc.nextInt();int[] a = new int[n+1];for(int i=1; i<=n; i++){a[i] = sc.nextInt();}int k = sc.nextInt();int d = sc.nextInt();//dpMax[i][j]表示以第i个人为最后一个,已经选择了j个人了long[][] dpMax = new long[n+1][k+1];long[][] dpMin = new long[n+1][k+1];long result = 0;for(int i=1; i<=n; i++){dpMax[i][1] = dpMin[i][1] = a[i];for(int j=2; j<=k; j++){if(i<j){dpMax[i][j] = dpMin[i][j] = 0;}else{for(int m=i-1; m>=Math.max(i-d, 1); m--){dpMax[i][j] = Math.max(dpMax[i][j], Math.max(dpMax[m][j-1]*a[i], dpMin[m][j-1]*a[i]));dpMin[i][j] = Math.min(dpMin[i][j], Math.min(dpMax[m][j-1]*a[i], dpMin[m][j-1]*a[i]));}}}result = Math.max(result, dpMax[i][k]);}System.out.println(result);}}}

6、剪气球

题目来源:http://exercise.acmcoder.com/quesexcuse?paperId=213

思路:在计算dp[i+1]时,我们需要考虑第i+1个数可以和前面哪些数分到一起组成连续的子数组。(参考:http://blog.csdn.net/jacky_chenjp/article/details/63684427)

代码:

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while(sc.hasNext()){int n = sc.nextInt();int[] a = new int[n];for(int i=0; i<n; i++){a[i] = sc.nextInt();}int[] dp = new int[n+1];dp[0] = 1;for(int i=1; i<=n; i++){int[] count = new int[10];for(int j=i-1; j>=0; j--){count[a[j]]++;if(count[a[j]]>1){break;}else{dp[i] = (dp[i]+dp[j])%1000000007;}}}System.out.println(dp[n]);  }}}

7、最长公共子括号序列(来自: 牛客网)

动态规划!!!动态规划!!!相关推荐

  1. 【算法】动态规划 ④ ( 动态规划分类 | 坐标型动态规划 | 前缀划分型动态规划 | 前缀匹配型动态规划 | 区间型动态规划 | 背包型动态规划 )

    文章目录 一.动态规划场景 二.动态规划分类 1.坐标型动态规划 2.前缀划分型动态规划 3.前缀匹配型动态规划 4.区间型动态规划 5.背包型动态规划 一.动态规划场景 动态规划 动态规划使用场景 ...

  2. 【转载】通过金矿模型介绍动态规划 (动态规划入门)

    先附上原文地址:http://www.cnblogs.com/sdjl/articles/1274312.html 通过金矿模型介绍动态规划 对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第 ...

  3. 动态规划 —— 动态规划概述

    [概述] 动态规划:解决多阶段决策问题的一种方法.实际上就是一种排除重复计算的算法,更具体的说,动态规划就是用空间换取时间. 多阶段决策问题:若一类问题的求解过程可分为若干个互相联系的阶段,在每一个阶 ...

  4. 【算法】动态规划 ① ( 动态规划简介 | 自底向上的动态规划示例 | 自顶向下的动态规划示例 )

    文章目录 一.动态规划简介 二.自底向上的动态规划示例 1.原理分析 2.算法设计 3.代码示例 三.自顶向下的动态规划示例 1.算法设计 2.代码示例 一.动态规划简介 动态规划 , 英文名称 Dy ...

  5. C语言采药动态规划,动态规划_POJ1775:采药

    3----------------------------------------------------------------------------小半年没写DP了,连个01背包都不会写了... ...

  6. LeetCode 10. Regular Expression Matching python特性、动态规划、递归

    前言 本文主要提供三种不同的解法,分别是利用python的特性.动态规划.递归方法解决这个问题 使用python正则属性 import reclass Solution2:# @return a bo ...

  7. 关于动态规划,你想知道的都在这里了!

    作者 | Your DevOps Guy 翻译| 火火酱~,责编 | 晋兆雨 出品 | AI科技大本营 头图 | 付费下载于视觉中国 什么是动态规划?它又有什么重要的呢? 在本文中,我将介绍由Rich ...

  8. 一文学会动态规划解题技巧

    前言 动态规划(dynamic programming,简称 dp)是工程中非常重要的解决问题的思想,从我们在工程中地图软件上应用的最短路径问题,再在生活中的在淘宝上如何凑单以便利用满减券来最大程度地 ...

  9. 算法导论-动态规划(dynamic programming)

    动态规划:通过组合子问题的解来解决整个问题. 动态规划的四个步骤: 1)描述最优解的结构: 2)递归定义最优解的值: 3)按自低向上的方式计算最优解的值(首先找到子问题的最优解,解决子问题,最后找到问 ...

  10. 大厂动态规划面试汇总,提升内功

    注:本文是BAT真题收录很值得大家花心思看完,看完会有收获. 前言 算法是面试大公司必考的项目,所以面试前准备好算法至关重要,今天整理的常见的动态规划题目,希望可以帮到大家. 要想学习其他绝世武功,要 ...

最新文章

  1. Bzoj2957: 楼房重建
  2. shell脚本--猜数字
  3. click事件延迟300ms,处理方法-----FastClick
  4. Java最大的优势真的在于跨平台吗?
  5. Android应用开发—浅谈MVX模式
  6. java计算雷达扫描范围_雷达扫描 - linyinmobayu - 博客园
  7. 如何在一周内上线50个用户增长策略
  8. Nginx+Php-fpm+MySQL+Redis源代码编译安装指南
  9. PyTorch 1.0 中文文档:广播语义
  10. # [银联复赛]-整数对:数论
  11. 'GO' 附近有语法错误问题,我真是无语~
  12. this绑定丢失的问题
  13. 怎么提高,芝麻信用分到750
  14. 医学软件项目开发(二):医学图像的显示及相关操作
  15. 不同vlan间通讯单臂路由和三层交换机
  16. Java 設計模式 - 適配器模式
  17. amazon.设计1. tic tac toe
  18. Android service后台执行定时任务
  19. Python教你用三行代码批量添加水印
  20. 呵呵,GET2017教育科技大会VIP门票,你要不要啊?

热门文章

  1. AI 投资探索路上的一些感受
  2. 如何用 R 绘制交互式社会网络图?
  3. stringstream切割字符串
  4. INI配置——《跟我学Shiro》
  5. unity3D之简单的碰撞检测 .
  6. python里面的pip是什么意思_python中的pip是什么意思
  7. DCloud 使用chrome调试
  8. 《K3 WISE常用数据表整理》
  9. 蓝桥杯---历届真题 题解
  10. 皮尔逊相关性的五个假设前提