<DP> (高频)139 375 374 (DP hard)312
139. Word Break
返回结果较为简单可用dp, 复杂用dfs
class Solution {
public boolean wordBreak(String s, List<String> wordDict) {
boolean[] dp = new boolean[s.length() + 1];
dp[0] = true;
//枚举所有substring
for(int i = 1; i <= s.length(); i++){
for(int j = 0; j < i; j++){
if(dp[j] && wordDict.contains(s.substring(j, i))){
dp[i] = true;
break;
}
}
}
return dp[s.length()];
}
}
375. Guess Number Higher or Lower II
guarantee a win。保证最小的花费能猜到即可
建立一个二维的 dp 数组,其中 dp[i][j] 表示从数字i到j之间猜中任意一个数字最少需要花费的钱数,那么需要遍历每一段区间 [j, i],维护一个全局最小值 global_min 变量,然后遍历该区间中的每一个数字,计算局部最大值 local_max = k + max(dp[j][k - 1], dp[k + 1][i]),这个正好是将该区间在每一个位置都分为两段,然后取当前位置的花费加上左右两段中较大的花费之和为局部最大值,为啥要取两者之间的较大值呢,因为要 cover 所有的情况,就得取最坏的情况。然后更新全局最小值,最后在更新 dp[j][i] 的时候看j和i是否是相邻的,相邻的话赋为j,否则赋为 global_min。这里为啥又要取较小值呢,因为 dp 数组是求的 [j, i] 范围中的最低 cost,比如只有两个数字1和2,那么肯定是猜1的 cost 低
class Solution {
public int getMoneyAmount(int n) {
int[][] dp = new int[n + 1][n + 1];
for(int i = 2; i <= n; i++){
for(int j = i - 1; j > 0; j--){
int globalMin = Integer.MAX_VALUE;
for(int k = j + 1; k < i; k++){
int localMax = k + Math.max(dp[j][k - 1], dp[k + 1][i]);
globalMin = Math.min(globalMin, localMax);
}
dp[j][i] = j + 1 == i ? j : globalMin;
}
}
return dp[1][n];
}
}
374. Guess Number Higher or Lower
二分查找
public class Solution extends GuessGame {
public int guessNumber(int n) {
if(guess(n) == 0) return n;
int left = 1, right = n;
while(left <= right){
int mid = left + (right - left) / 2;
if(guess(mid) == -1){
right = mid - 1;
}else if(guess(mid) == 1){
left = mid + 1;
}else
return mid;
}
return left;
}
}
312. Burst Balloons
dp[i][j] 表示打爆区间 (i, j) 中的所有气球能得到的最多金币。
第1层循环,dp[][]长度的大小k,第一轮为1个数,第二轮为2个数。
第2层循环,left的开始起点,都从0开始。 right为窗口的右边界
第3层循环, i表示打爆当前的气球,依次扫描窗口内的dp, 取最大值。
假如第i个气球最后被打爆,那么此时区间 [left, right] 被分成了三部分,[left, i],[i],和 [i, right],只要之前更新过了 [left, i] 和[i, right]这两个子区间的 dp 值,可以直接用。
dp[left][ right] 的意义是什么呢,相当于区间 [left, right] 中除了第i个气球,其他的已经爆了,那么周围的气球只能是第 left个,和第 right 个了
class Solution {
public int maxCoins(int[] nums) {
int[] iNums = new int[nums.length + 2];
int n = 1;
for(int x : nums) if(x > 0) iNums[n++] = x;
iNums[0] = iNums[n++] = 1;
int[][] dp = new int[n][n];
for(int k = 2; k < n; k++){
for (int left = 0; left < n - k; left++){
int right = left + k;
for(int i = left + 1; i < right; i++){
dp[left][right] = Math.max(dp[left][right],
iNums[left]* iNums[i] * iNums[right]+ dp[left][i] + dp[i][right]);
}
}
}
return dp[0][n - 1];
}
}
<DP> (高频)139 375 374 (DP hard)312的更多相关文章
- dp乱写2:论dp在不在dp中(但在dp范畴)内的应用
最近正儿八经的学习了dp,有一些题目非常明显看出来就是dp了比如说:过河卒.方格取数.导弹拦截.加分二叉树.炮兵阵地更加明显的还有:采药.装箱问题.过河.金明的预算方案.今天来谈谈dp的dp在不在dp ...
- [提升性选讲] 树形DP进阶:一类非线性的树形DP问题(例题 BZOJ4403 BZOJ3167)
转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7337179.html 树形DP是一种在树上进行的DP相对比较难的DP题型.由于状态的定义多种多样,因此解法也五 ...
- 【转】斜率优化DP和四边形不等式优化DP整理
(自己的理解:首先考虑单调队列,不行时考虑斜率,再不行就考虑不等式什么的东西) 当dp的状态转移方程dp[i]的状态i需要从前面(0~i-1)个状态找出最优子决策做转移时 我们常常需要双重循环 (一重 ...
- hdu5800 To My Girlfriend dp 需要比较扎实的dp基础。
To My Girlfriend Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- POJ2411Mondriaan's Dream(DP+状态压缩 or 插头DP)
问题: Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after prod ...
- poj 2229 【完全背包dp】【递推dp】
poj 2229 Sumsets Time Limit: 2000MS Memory Limit: 200000K Total Submissions: 21281 Accepted: 828 ...
- D. Easy Problem dp(有衔接关系的dp(类似于分类讨论) )
D. Easy Problem dp(有衔接关系的dp(类似于分类讨论) ) 题意 给出一个串 给出删除每一个字符的代价问使得串里面没有hard的子序列需要付出的最小代价(子序列不连续也行) 思路 要 ...
- dp学习笔记(各种dp,比较杂)
HDU1176 中文题意不多解释了. 建一个二维dp数组,dp[ i ][ j ]表示第 i 秒落在 j 处一个馅饼.我们需要倒着DP,为什么呢,从 0秒,x=5处出发,假如沿数组正着往下走,终点到哪 ...
- Atcoder Educational DP Contest I - Coins (概率DP)
题意:有\(n\)枚硬币,每枚硬币抛完后向上的概率为\(p[i]\),现在求抛完后向上的硬币个数大于向下的概率. 题解:我们用二维的\(dp[i][j]\)来表示状态,\(i\)表示当前抛的是第\(i ...
随机推荐
- ASM与ASMD
时序机 状态机 控制器 数据通路之间的关系 样例代码
- vivado2017.1和modelsim10.5联合仿真
vivado2017.1和modelsim版本 vivado可在xilinx官网查询匹配的modelsim最低版本,下载modelsim前记得选用合适的版本号,如图 查询地址:https://www. ...
- vscode源码分析【三】程序的启动逻辑,性能问题的追踪
第一篇: vscode源码分析[一]从源码运行vscode 第二篇:vscode源码分析[二]程序的启动逻辑,第一个窗口是如何创建的 启动追踪 代码文件:src\main.js 如果指定了特定的启动参 ...
- python保存文字到文件中
使用encode方法即可,举例如下: #-*-coding:utf-8-*- def save(re, name): file = open("index_cut.txt", &q ...
- RPA中房产证的 OCR 识别
客户需求,识别一些证件内容,包括身份证.户口本.营业执照.银行卡以及房产证,前四个比较容易实现,不管是艺赛旗的 RPA 还是百度的 OCR 都有接口,直接调用即可,但是都没有房产证的 OCR 识别,只 ...
- keras对图像数据进行增强 | keras data augmentation
本文首发于个人博客https://kezunlin.me/post/8db507ff/,欢迎阅读最新内容! keras data augmentation Guide code # import th ...
- httpclient超时时间设置及代理设置
超时时间 设置HttpClient的超时时间,非常有必要性,因为httpclient 默认超时时间很长,自己可以测试一下是多久,设置超时时间否则会影响自己系统的业务逻辑,例如阻塞系统,影响系统的吞吐量 ...
- Oracle - 截取指定日期的alert log
工作中DBA经常会查看alert log来检查数据库后台都记录了些什么日志,如果只想看某一天或者某段时间范围的日志,能够把这些日志从大的alert log中截取下来放到一个单独的文件中,对于查看和下载 ...
- 转 googlenet论文解读
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/u014061630/article/det ...
- -ffast-math编译选项作用
https://stackoverflow.com/questions/7420665/what-does-gccs-ffast-math-actually-do