当前位置: 首页 > news >正文

动态规划以及在leetcode中的应用

    之前只是知道动态规划是通过组合子问题来解决原问题的,但是如何分析,如何应用一直都是一头雾水。最近在leetcode中发现有好几道题都可以用动态规划方法进行解决,就此做下笔录。

动态规划:应用于子问题重叠情况,原问题的多个子问题间可能含有相同的子子问题,当然,关于将原问题分解成子问题的思路,分治算法也是可行的,但是如果采用分治递归来解决就会出现一些问题。在重复的子问题的计算中,分治算法会忽略到重复问题,也就是说相同的问题,分治算法会计算多次,这样效率会很低。而动态规划算法会仔细安排求解顺序,对每个子问题只求解一次,并将结果保留下来,这样当遇到重复问题,只需查找保存结果,无需重新计算。

动态规划有两种等价的实现方法:

1.带备忘的自顶向下法。

2.自底向上法。

LeetCode题目---Decode Ways:

A message containing letters from A-Z is being encoded to numbers using the following mapping:

'A' -> 1
'B' -> 2
...
'Z' -> 26

Given an encoded message containing digits, determine the total number of ways to decode it.

For example,
Given encoded message "12", it could be decoded as "AB" (1 2) or "L" (12).

The number of ways decoding "12" is 2.

分析:

边界条件:

1. 输入字符串长度为0时,则为0

2. 输入字符串的第一个数不能为0,若为0,则为0

根据例子我们可以知道问题可以分解成sum[i]=sum[i-1]+sum[i-2](i>1).

 可以采用自底向上法的思想,有顺的将子问题有小到大进行求解。

代码如下:

public int numDecodings(String s) {
        if(0 == s.length()) return 0;
        if(s.charAt(0)=='0') return 0;
        int []num = new int[s.length()];//记录遍历到字符串第i位置时的状态(该状态指的是编码的方法数)
        num[0] = 1;
        for(int i=1;i<s.length();i++){
            if(s.charAt(i) != '0') num[i] = 1;
            String temp = s.substring(i-1, i+1);
            if(temp.charAt(0)=='0') continue;
            if(Integer.parseInt(temp)>0&&Integer.parseInt(temp)<27){
                if(1==i){
                    num[i]+=1;
                }else{
                    num[i]+=num[i-2];
                }
             }
            }
        return num[s.length()-1];
    }

当然leetcode中不只一道用到动态规划的思想,后续会再总结其他题目。

转载于:https://www.cnblogs.com/Eunice-mogu/p/3961017.html

相关文章:

  • canvas绘制圆角头像
  • 第一个ServiceStack程序
  • OSChina 周六乱弹 —— 舔狗是没有好下场的
  • 英菲利普亲王车祸后确认未受伤 事发道路下调限速
  • Linux下修改MySQL的用户(root)的密码
  • 20140912-事件与委托
  • Greenplum -- 资源队列管理
  • C++范畴下测试数据类型的范围整理
  • iOS UIWebView截获html并修改便签内容
  • MySQL报错解决:ERROR! The server quit without updating
  • Jsp forward plugin的操作和方法
  • SQL手工注入漏洞测试(Sql Server数据库)
  • Windows Core OS 包含了开源组件
  • 快过年了,我给小明制定了一份价值60万的Java学习计划
  • windows程序设计简介
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • express + mock 让前后台并行开发
  • express.js的介绍及使用
  • Facebook AccountKit 接入的坑点
  • Git同步原始仓库到Fork仓库中
  • Less 日常用法
  • Mac转Windows的拯救指南
  • opencv python Meanshift 和 Camshift
  • python_bomb----数据类型总结
  • Vim 折腾记
  • 关于List、List?、ListObject的区别
  • 巧用 TypeScript (一)
  • 区块链分支循环
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • $().each和$.each的区别
  • (搬运以学习)flask 上下文的实现
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (论文阅读40-45)图像描述1
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • *2 echo、printf、mkdir命令的应用
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .net MySql
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .NET命名规范和开发约定
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [ 数据结构 - C++] AVL树原理及实现
  • [\u4e00-\u9fa5] //匹配中文字符
  • []error LNK2001: unresolved external symbol _m
  • [④ADRV902x]: Digital Filter Configuration(发射端)
  • [Angular 基础] - 自定义指令,深入学习 directive
  • [ARM]ldr 和 adr 伪指令的区别