日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 1340. 跳跃游戏 V(DP)

發布時間:2024/7/5 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 1340. 跳跃游戏 V(DP) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 題目

給你一個整數數組 arr 和一個整數 d 。每一步你可以從下標 i 跳到:

  • i + x ,其中 i + x < arr.length 且 0 < x <= d 。
  • i - x ,其中 i - x >= 0 且 0 < x <= d 。

除此以外,你從下標 i 跳到下標 j 需要滿足:arr[i] > arr[j] 且 arr[i] > arr[k] ,其中下標 k 是所有 i 到 j 之間的數字(更正式的,min(i, j) < k < max(i, j))。

你可以選擇數組的任意下標開始跳躍。請你返回你 最多 可以訪問多少個下標。

請注意,任何時刻你都不能跳到數組的外面。

示例 1:

輸入:arr = [6,4,14,6,8,13,9,7,10,6,12], d = 2 輸出:4 解釋:你可以從下標 10 出發,然后如上圖依次經過 10 --> 8 --> 6 --> 7 。 注意,如果你從下標 6 開始,你只能跳到下標 7 處。你不能跳到下標 5 處因為 13 > 9 。 你也不能跳到下標 4 處,因為下標 5 在下標 46 之間且 13 > 9 。 類似的,你不能從下標 3 處跳到下標 2 或者下標 1 處。示例 2: 輸入:arr = [3,3,3,3,3], d = 3 輸出:1 解釋:你可以從任意下標處開始且你永遠無法跳到任何其他坐標。示例 3: 輸入:arr = [7,6,5,4,3,2,1], d = 1 輸出:7 解釋:從下標 0 處開始,你可以按照數值從大到小,訪問所有的下標。示例 4: 輸入:arr = [7,1,7,1,7,1], d = 2 輸出:2示例 5: 輸入:arr = [66], d = 1 輸出:1提示: 1 <= arr.length <= 1000 1 <= arr[i] <= 10^5 1 <= d <= arr.length

來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/jump-game-v
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

2. DP解題

相關題目:
LeetCode 55. 跳躍游戲(貪心)
LeetCode 45. 跳躍游戲 II(貪心/BFS,難)
LeetCode 1306. 跳躍游戲 III(廣度優先搜索BFS)
LeetCode 1345. 跳躍游戲 IV(BFS)
LeetCode LCP 09. 最小跳躍次數

  • 首先根據題意,只能往低了跳,且中間不能遇到比我高的
  • 用 dp[i] 表示從 i 開始跳,最多可以跳的臺階數
  • 那么 dp 需要從低的開始往高的計算,所以要先排序
  • 狀態轉移方程 dp[i]=max(dp[i],1+dp[j])dp[i] = max(dp[i], 1+dp[j])dp[i]=max(dp[i],1+dp[j]), 從 i 跳到所有可能的 j
class Solution { public:int maxJumps(vector<int>& arr, int d) {int i, j, n = arr.size(), idx;vector<int> dp(n, 0);//dp數組multimap<int, int> m;for (i = 0; i < n; i++)m.insert(make_pair(arr[i],i));//map有序,默認升序,按數值排序了for(auto& it : m){ //從低到高開始dpidx = it.second;//下標dp[idx] = 1;//至少為1,自己本身for(j = idx-1; j >= idx-d && j>=0 && arr[idx] > arr[j]; j--){ //往左邊跳,遇到比我高的停止dp[idx] = max(dp[idx], 1+dp[j]);}for(j = idx+1; j <= idx+d && j<n && arr[idx] > arr[j]; j++){ //往右邊跳,遇到比我高的停止dp[idx] = max(dp[idx], 1+dp[j]);}}return *max_element(dp.begin(),dp.end());//取最大值} };

總結

以上是生活随笔為你收集整理的LeetCode 1340. 跳跃游戏 V(DP)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。