2018微软实习笔试一道dp题目总结

题意大概是说在一维数轴上起点和终点的距离是d,现在我们要从起点走到终点。每走一个单位长度消耗一个单位能量,初始时有K单位能量。同时在起点和终点之间分布一些加油站a1,a2,...an,给你加油站数量、位置以及每个加油站储油量,问你要走到终点,至少需要停在几个加油站加油。

类似于http://www.cnblogs.com/wangyiming/p/7193446.html这道题,直接用dp求解“到达一定距离至少停下来几次”的原问题并不方便,于是转换思路,采用一种“对偶”的方式求解“停下来固定次数能到达的最远距离”。定义状态dp[i][j]表示到前i个加油站为止,停了j个加油站能到达的最远距离,那么dp[i][j] = max(dp[i - 1][j - 1] + a[i], dp[i - 1][j])。最终在所有满足dp[n][j] >= d的j中,最小的一个就是答案。

这样做时间复杂度是O(n2)的,空间复杂度通过滚动数组可以压缩到O(n)。不知是否可以进一步优化。

dp问题在直接求解遇到困难的时候,不妨试试这样的思路。

原文地址:https://www.cnblogs.com/wangyiming/p/8744388.html

时间: 2024-08-29 18:41:04

2018微软实习笔试一道dp题目总结的相关文章

2015腾讯暑期实习笔试题目

2015腾讯暑期实习笔试题目 (1).层次遍历序列为ABCDEFG的二叉树,其中序遍历的序列是什么? (2).ABCABC为入栈的顺序,倘若出栈的顺序为ABCCBA,那么,设栈的操作为PUSH和POP,则PUSH和POP的可能序列是什么? (3).使用顺序数组存储堆,90,31,53,23,16,48:16,31,23,90,53,48:这两个序列是否符合堆的定义. (4).稀疏矩阵的存储结构可以是什么? (5).根据后序遍历和中序遍历的序列,如何恢复此二叉树. (6).Linux常用命令:ls

从一道趣味题目学习正则表达式

前天做了陈皓的趣味竞赛题目(fun.coolshell.cn),一直卡在第四道题目回文猫处不知所以然,看了微博上的提示,知道需要用正则表达式,但是不确定使用表达式的模式和原文,下面是第四道题的截图和链接,不看解析,你可以想到通关的办法吗? 看了答案,才知道source藏在网页的html源码中,曾经有过去看源码的念头,想作者不会这么geek吧,结果...就在源码中,下面是需要搜寻的网页的源码: <!-- h8:[email protected]:V<7Q3:]iqbn58\YoLGtweZus;

DP题目列表/弟屁专题

声明: 1.这份列表不是我原创的,放到这里便于自己浏览和查找题目. ※最近更新:Poj斜率优化题目 1180,2018,3709 列表一:经典题目题号:容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1191,1208, 1276, 1322, 1414, 1456, 1458, 1609, 1644, 1664, 1690, 1699, 1740, 1742, 1887, 1926, 1936, 195

2015微软实习在线笔试题 - Professor Q&#39;s Software

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Professor Q develops a new software. The software consists of N modules which are numbered from 1 to N. The i-th module will be started up by signal Si. If signal Si is generated multiple times, the i-th module

之前同事问到的一道python题目

Python面试题 之前同事问了一道Python题目如下,暂时归类为面试题 题目:把类似'123.456'的字符串转换成浮点型数据 方法一: >>> print '{:.3f}'.format(float('123.456')) >>> 123.456 方法二:指定map.reduce高阶函数 思路:先处理小数点,然后在整数位.小数位相加.步骤如下 s = '123.456' 处理小数:使用字符串切片方式. s.split('.') 这样就得到长度为2的数组['123'

一道算法题目, 二行代码, Binary Tree

June 8, 2015 我最喜欢的一道算法题目, 二行代码. 编程序需要很强的逻辑思维, 多问几个为什么, 可不可以简化.想一想, 二行代码, 五分钟就可以搞定; 2015年网上大家热议的 Homebrew 的作者 Max Howell 面试 Google 挂掉的一题, 二叉树反转, 七行代码, 相比二行代码, 情有可原! Problem: return the count of binary tree with only one child 想一想, 你要写几行, 六七行, 或小于十行? S

一道ioccc题目

国际C语言混乱大赛的一个题: main() {printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);} 这道题目输出的结果是:unix 很有意思的一道题.....本质还是数组和指针问题 一道ioccc题目

以另一种位图的思想来解决一道OJ题目

前言: 以前所接触到的位图的思想都是以1位的形式去存储某个数出现的次数是1次还是0次.常见的例子不外乎在<编程珠玑>上的开篇例子里,1千万个数的排序统计,用1.25M的内存空间就可以达到遍历一遍输入数据而排序好的目的.这种思想是通用的么?也就是说,假如输入数据不再是0次或者1次,而是2次或者更多的时候,如何再次用上这种思想呢?请看下面题目 题目: 输入一个数组,数组有int类型整数若干,若有其中一个是出现一次或者两次,其他数字都是出现3次,要求在时间复杂度在O(N)上限里求出那个数字. 解法一

一道简单题目的优化过程——抽签问题

题目来源:挑战程序设计竞赛 题目描述: 给定n个数字,选择四次,可以选择已经选择过的数字,问是否可以选出和为m的四个数. 首先,最基本的做法: 枚举四层,每一层枚举出一个数,求出所有四个数字不同的排列.时间复杂度为O(N^4). for (int i1=1;i1<=n;i++) for (int i2=i1;i2<=n;i2++) for (int i3=i2;i3<=n;i3++) for (int i4=i3;i4<=n;i4++) 让我们来一步步优化吧. 基本做法的本质是,枚