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的更多相关文章

  1. dp乱写2:论dp在不在dp中(但在dp范畴)内的应用

    最近正儿八经的学习了dp,有一些题目非常明显看出来就是dp了比如说:过河卒.方格取数.导弹拦截.加分二叉树.炮兵阵地更加明显的还有:采药.装箱问题.过河.金明的预算方案.今天来谈谈dp的dp在不在dp ...

  2. [提升性选讲] 树形DP进阶:一类非线性的树形DP问题(例题 BZOJ4403 BZOJ3167)

    转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7337179.html 树形DP是一种在树上进行的DP相对比较难的DP题型.由于状态的定义多种多样,因此解法也五 ...

  3. 【转】斜率优化DP和四边形不等式优化DP整理

    (自己的理解:首先考虑单调队列,不行时考虑斜率,再不行就考虑不等式什么的东西) 当dp的状态转移方程dp[i]的状态i需要从前面(0~i-1)个状态找出最优子决策做转移时 我们常常需要双重循环 (一重 ...

  4. hdu5800 To My Girlfriend dp 需要比较扎实的dp基础。

    To My Girlfriend Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  5. POJ2411Mondriaan's Dream(DP+状态压缩 or 插头DP)

    问题: Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after prod ...

  6. poj 2229 【完全背包dp】【递推dp】

    poj 2229 Sumsets Time Limit: 2000MS   Memory Limit: 200000K Total Submissions: 21281   Accepted: 828 ...

  7. D. Easy Problem dp(有衔接关系的dp(类似于分类讨论) )

    D. Easy Problem dp(有衔接关系的dp(类似于分类讨论) ) 题意 给出一个串 给出删除每一个字符的代价问使得串里面没有hard的子序列需要付出的最小代价(子序列不连续也行) 思路 要 ...

  8. dp学习笔记(各种dp,比较杂)

    HDU1176 中文题意不多解释了. 建一个二维dp数组,dp[ i ][ j ]表示第 i 秒落在 j 处一个馅饼.我们需要倒着DP,为什么呢,从 0秒,x=5处出发,假如沿数组正着往下走,终点到哪 ...

  9. Atcoder Educational DP Contest I - Coins (概率DP)

    题意:有\(n\)枚硬币,每枚硬币抛完后向上的概率为\(p[i]\),现在求抛完后向上的硬币个数大于向下的概率. 题解:我们用二维的\(dp[i][j]\)来表示状态,\(i\)表示当前抛的是第\(i ...

随机推荐

  1. Android 中的AlertDialog使用自定义布局

    Android使用指定的View开发弹窗功能 Android开发中进程会使用到我们的AlertDialog,但是比较可惜的是我们的Android原生的AlertDialog的效果又比较的简陋,这个时候 ...

  2. 【转】Java中的关键字 transient

    阅读目录 先解释下Java中的对象序列化 关于transient关键字 举个例子 参考资料 先解释下Java中的对象序列化 在讨论transient之前,有必要先搞清楚Java中序列化的含义: Jav ...

  3. [学习笔记] Manacher与PAM

    \(1\) Manacher 挺短,背是挺好背的 Manacher用于求回文串长度.思想大概就是: 1.加入字符集之外的识别字符(比如#)分隔开原来相邻的字母,这样所有的回文串都变成了以某个字符为中心 ...

  4. 趣谈Linux操作系统学习笔记:第二十六讲

    一.内核页表 和用户态页表不同,在系统初始化的时候,我们就要创建内核页表了 我们从内核页表的根swapper_pg_dir开始找线索,在linux-5.1.3/arch/x86/include/asm ...

  5. Python自动群发邮件,只需20行代码!

    今日分享 Python自动群发邮件 import smtplib from email import (header) from email.mime import (text, applicatio ...

  6. 隐马尔可夫模型(HMM)及Viterbi算法

    HMM简介 对于算法爱好者来说,隐马尔可夫模型的大名那是如雷贯耳.那么,这个模型到底长什么样?具体的原理又是什么呢?有什么具体的应用场景呢?本文将会解答这些疑惑. 本文将通过具体形象的例子来引入该模型 ...

  7. python接口自动化6-参数化关联

    前言 接口中我们经常需要用到参数关联,比如,登录token,需要传给后面的参数使用,又比如要查看某个商品需要将商品的id传入下一个接口使用. 等等,所以我们必要学会 re 正则获取,或者返回json获 ...

  8. 06-Django视图

    什么是视图? 视图就是应用中views.py文件中的函数,视图函数的第一个参数必须是request(HttpRequest)对象.返回的时候必须返回一个HttpResponse对象或子对象(包含Htt ...

  9. Netty—TCP的粘包和拆包问题

    一.前言 虽然TCP协议是可靠性传输协议,但是对于TCP长连接而言,对于消息发送仍然可能会发生粘贴的情形.主要是因为TCP是一种二进制流的传输协议,它会根据TCP缓冲对包进行划分.有可能将一个大数据包 ...

  10. createscope

    /// <summary> /// Creates a new <see cref="IServiceScope"/> that can be used t ...