leetcode動態規劃

2021-10-08 14:09:02 字數 3879 閱讀 4349

給定乙個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。相鄰的結點 在這裡指的是 下標 與 上一層結點下標 相同或者等於 上一層結點下標 + 1 的兩個結點。

例如,給定三角形:

[[2],

[3,4],

[6,5,7],

[4,1,8,3]

]自頂向下的最小路徑和為 11(即,2 + 3 + 5 + 1 = 11)。

class

solution

else

if(j==i)

else}}

for(

int i=

0;ireturn result;}}

;

給定乙個未排序的整數陣列,找出最長連續序列的長度。

要求演算法的時間複雜度為 o(n)。

示例:輸入: [100, 4, 200, 1, 3, 2]

輸出: 4

解釋: 最長連續序列是 [1, 2, 3, 4]。它的長度為 4。

思路:用set記錄元素,然後對於每乙個數不斷在set中找它的連續序列;如果num-1存在於set中,則不從這個數開始查詢。

class

solution

for(

auto num:nums)

else

num+=1

;}if(tmp_result>result)}}

return result;}}

;

給定乙個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。

說明:每次只能向下或者向右移動一步。

示例:輸入:

[[1,3,1],

[1,5,1],

[4,2,1]

]輸出: 7

解釋: 因為路徑 1→3→1→1→1 的總和最小。

class

solution

}else}}

else

}return0;

}bool

check

(int r,

int c)

else}}

;

乙個機械人位於乙個 m x n 網格的左上角 (起始點在下圖中標記為「start」 )。

機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角

[[0,0,0],

[0,1,0],

[0,0,0]

]輸出: 2

class

solution

grid[0]

[0]=

1;rows=grid.

size()

; cols=grid[0]

.size()

;int cur_r=

0,cur_c=0;

int pos_r,pos_c;

int a,b;

while

(true

)else

pos_r+=1

; pos_c-=1

;}}else

else

pos_r+=1

; pos_c-=1

;}}}

else

}return0;

}bool

check

(int r,

int c)

else}}

;

給定乙個非負整數陣列,你最初位於陣列的第乙個位置。

陣列中的每個元素代表你在該位置可以跳躍的最大長度。

判斷你是否能夠到達最後乙個位置。

輸入: [2,3,1,1,4]

輸出: true

解釋: 我們可以先跳 1 步,從位置 0 到達 位置 1, 然後再從位置 1 跳 3 步到達最後乙個位置。

思路: 維護乙個可到達的最大點

class

solution

}else}if

(range>=

(len-1)

)else}}

;

給定乙個非負整數陣列,你最初位於陣列的第乙個位置。

陣列中的每個元素代表你在該位置可以跳躍的最大長度。

你的目標是使用最少的跳躍次數到達陣列的最後乙個位置。

思路: 用優先佇列記錄當前距離最小的節點,如果最小的節點不能到達當前節點則pop

其實更簡單的方法是直接貪婪的選擇能跳的更遠的下乙個節點

struct pair

bool

operator

<

(const pair& a)

const};

class

solution

else}}

return result;}}

;

給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。

class

solution

int j;

int result=0;

int left;

int right;

vectorbool

>>

dp(len,vector<

bool

>

(len,

false))

;for

(int l=

1; l<=len;l++)}

}else

if(l==1)

}}else}}

}}return s.

substr

(left,result);}

};

給定兩個字串 text1 和 text2,返回這兩個字串的最長公共子串行的長度。

乙個字串的 子串行 是指這樣乙個新的字串:它是由原字串在不改變字元的相對順序的情況下刪除某些字元(也可以不刪除任何字元)後組成的新字串。

例如,「ace」 是 「abcde」 的子串行,但 「aec」 不是 「abcde」 的子串行。兩個字串的「公共子串行」是這兩個字串所共同擁有的子串行。

若這兩個字串沒有公共子串行,則返回 0。

class

solution

else}}

return dp[len1]

[len2];}

};

給你兩個單詞 word1 和 word2,請你計算出將 word1 轉換成 word2 所使用的最少運算元 。

你可以對乙個單詞進行如下三種操作:

插入乙個字元

刪除乙個字元

替換乙個字元

class

solution

for(

int i=

0; i1;i++

)for

(int i=

1; i1;i++

)else}}

return dp[len1]

[len2];}

};

有 n 個物品和乙個大小為 m 的揹包. 給定陣列 a 表示每個物品的大小和陣列 v 表示每個物品的價值.

問最多能裝入揹包的總價值是多大?

class

solution

else}}

int result=dp[m]

[cats]

; dp.

clear()

;return result;}}

;

leetcode 動態規劃

題目如下 給定乙個整型陣列,至少有乙個元素,請計算子陣列最大乘積是多少?子陣列必須是原陣列中連續的一串數字構成的陣列。整數可正可負。例如 給定陣列 2,3,2,4 經過計算,得到最大乘積為6。子陣列為 2,3 根據原貼的解題思路,這道題可以用動態規劃來解,但難度在 呢?負負得正,就可惡在這裡。那這個...

Leetcode 動態規劃

題目 原題鏈結在這裡 最長字串鏈。給乙個單詞列表,找乙個詞鏈,使得詞鏈後乙個單詞由前乙個單詞增加乙個字元得到,求最長詞鏈長度。解答 1 根據詞鏈的定義,短的單詞可以由長的單詞減去單詞中乙個字元得到。因此可以先對單詞列表,按照單詞的長度從大到小排序。2 單詞的最大長度為 16,因此可以對於每個單詞 w...

leetcode 動態規劃

題目 給定乙個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。每次只能向下或者向右移動一步。示例 輸入 1,3,1 1,5,1 4,2,1 輸出 7 解釋 因為路徑 1 3 1 1 1 的總和最小。思路 定義一維陣列dp用於記錄起始點到某一點最小距離,...