演算法 動態規劃練習

2021-08-17 05:09:22 字數 1428 閱讀 4076

前兩篇博文已經稍微詳細地講了動態規劃的概念、演算法實現以及優化

上網搜幾道題來實戰

下面這個是從別人那裡看到的題目,找到這道題的主要原因是我前幾天看了網易的題目,emmm不會做。。。

沒錯我就是因為受了打擊才開始研究演算法的qaq

文章太長了還沒看,從點讚量來看應該是篇好文章,先用自己的方法試一試吧,不會再看答案

問題描述

數字三角形(poj1163)

7

3 8

8 1 0

2 7 4 4

4 5 2 6 5

在上面的數字三角形中尋找一條從頂部到底邊的路徑,使得路徑上所經過的數字之和最大。路徑上的每一步都只能往左下或右下走。只需要求出這個最大和即可,不必給出具體路徑。 三角形的行數大於1小於等於100,數字為 0 - 99

輸入格式:

5 //表示三角形的行數 接下來輸入三角形

73 8

8 1 0

2 7 4 4

4 5 2 6 5

要求輸出最大和

分析:①先用個陣列存一下。

②求最優解問題,用動態規劃的方法就是不管三七二十一列列看公式啦

先來個sum[i][j]表示當前站在第i行第j列的節點的最大和,要走到這個節點的話,就要考慮它上個節點的最大和咯

由圖可以看出,有些節點有兩個父親有些有乙個,也就是說當前節點要考慮上兩個節點的情況(大部分兩個嘛)

sum[i][j]=max

我們畫一下這個表(我把二維陣列不需要用到的部分去掉,從結構上看還是用樹比較開心)

得到最終結果是30

怎麼找到路徑呢?

從30往上找,它的父親是20或25,在題幹給出的二維陣列中可以看出,30這個位置的節點原本數值是5,說明30是通過5加上5的父親得到的,5的父親=30-5=25,get到一條路,通過這種方法,找到路徑如下:

看一下原博文的答案,是30。解答方法不一樣,大概看了下,他是從下往上遍歷的,萬變不離其宗,不過博主的優化寫得很棒,建議大家讀一讀,

就醬。

再推薦一篇文章

大家可以看下最長公共子串行和最長公共字串的演算法,看完之後會愛上動態規劃的,至於kmp演算法,我明天再戰!

演算法練習 動態規劃

leecode題庫 139.單詞拆分 當乙個大問題裡包含小問題時,為避免重新計算小問題,可以將之前問題的答案進行記錄,計算大問題時便可以跳過小問題計算直接呼叫小問題答案。大問題 這個字串是否由單詞組成 小問題 前i位是否由字串組成 遞迴關係 如果這個字串能由單詞組成,則0至a1 1是乙個單詞,0至a...

演算法練習 動態規劃(一)

給定乙個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。說明 每次只能向下或者向右移動一步。示例 輸入 1 3,1 1 5,1 4 2,1 輸出 7 解釋 因為路徑 1 3 1 1 1 的總和最小。解題思路 class solution int min...

動態規劃練習

題目描述 給出兩個單詞word1和word2,計算出將word1 轉換為word2的最少操作次數。你總共三種操作方法 插入乙個字元 刪除乙個字元 替換乙個字元 include include include using namespace std int find min int x,int y,i...