私の質問LeetCodeブラシソース[GitHubの]:https://github.com/izhoujie/Algorithmcii
LeetCode面の質問17.16。マッサージ師
タイトル
既知のマッサージセラピストは、予約要求の安定したストリームを受信する、予約は、各接続又は未接続のために選択することができます。彼女は隣の予定を受け入れることができなかったので、各予約サービスの間、休息する時間を持っています。予約要求、最適なセット(最長総予約)を見つけるためにマッサージセラピストの予約の順序を考えると、数分の合計数を返します。
注:この問題は、元のタイトルに比較的小さな変更であります
例1:
输入: [1,2,3,1]
输出: 4
解释: 选择 1 号预约和 3 号预约,总时长 = 1 + 3 = 4。
例2:
输入: [2,7,9,3,1]
输出: 12
解释: 选择 1 号预约、 3 号预约和 5 号预约,总时长 = 2 + 9 + 1 = 12。
例3:
输入: [2,1,4,5,3,1,1,3]
输出: 12
解释: 选择 1 号预约、 3 号预约、 5 号预约和 8 号预约,总时长 = 2 + 4 + 3 + 3 = 12。
出典:滞在ボタン(LeetCode)
:リンクhttps://leetcode-cn.com/problems/the-masseuse-lcci
すべてのネットワークからの控除が著作権を保有。商業転載は、ソースを明記してください許可公式、非商用の転載をご連絡ください。
問題解決のためのアイデア
動的プログラミングの1-DPのアイデア;
等しい長NUMSアレイDP、DPの[i]を作成1-するi番目つかむことができ、カットオフの最大値を示し、
前の3 NUMS 0,1,2の最初のために、単純な分析。
- DP [0] = NUMS [0]、すなわち、最初の現在の最良のグラブ。
- DP [1] = Math.max(DP [0]、NUMS [1])、すなわち、第一又は第二の電流グラブベスト。
- DP [2] = Math.max(DP [2-1]、DP [2-2] + NUMS [2])、すなわち直接離れDP [1]の結果、または検討[0] DP取り、なおNUMS [2]、後者が最大である場合、
- 利用可能な誘導一般式DP:DP [I] = Math.max(DP [I-1]、DP [I-2] + NUMS [I])。
DPの動的な計画が伝達方程式を得るために、質問の意味の慎重な分析が必要
アイデアアイデア2- 1、前者と現在の結果の結果と考え時間、アレイは、2つの変数の値に対して最適化することができるDP。
1つのDP用:[I] = Math.max (DP [I-1]、DP [I-2] + NUMS [I])
のために最適化
:- tempMax Math.max =(最大、CURR NUMS + [I ])
- CURR =最大値
-最大値= tempMax
キーは、動的プログラミング遷移方程式を見つけることであるが、いくつかのケースでは、DP配列反復であることがいくつかの変数を最適化することができ、安価なメモリ
アルゴリズムのソースコードの例
package leetcode;
/**
* @author ZhouJie
* @date 2020年3月24日 下午7:49:36
* @Description: 面试题 17.16. 按摩师
*
*/
public class LeetCode_Satine_17_16 {
}
class Solution_17_16 {
/**
* @author: ZhouJie
* @date: 2020年3月24日 下午8:41:37
* @param: @param nums
* @param: @return
* @return: int
* @Description: 1-dp动态规划;
*
*/
public int massage_1(int[] nums) {
int len = 0;
if (nums == null || (len = nums.length) == 0) {
return 0;
}
if (len == 1) {
return nums[0];
}
int[] dp = new int[len];
dp[0] = nums[0];
dp[1] = Math.max(nums[0], nums[1]);
for (int i = 2; i < len; i++) {
dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]);
}
return dp[len - 1];
}
/**
* @author: ZhouJie
* @date: 2020年3月24日 下午8:41:54
* @param: @param nums
* @param: @return
* @return: int
* @Description: 2-动态规划优化掉数组;
*
*/
public int massage_2(int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
int max = 0, curr = 0;
for (int i : nums) {
int temp = Math.max(max, curr + i);
curr = max;
max = temp;
}
return max;
}
}