前兩篇博文已經稍微詳細地講了動態規劃的概念、演算法實現以及優化
上網搜幾道題來實戰
下面這個是從別人那裡看到的題目,找到這道題的主要原因是我前幾天看了網易的題目,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...