動態規劃入門

2021-08-17 10:03:05 字數 1678 閱讀 4887

最長公共子串行(lcs)

lcs:遞迴

int findlcs(string a, int n, string b, int m)
採用動態規劃的策略o(n*m):

將計算的方向顛倒,將遞迴改為迭代

0)將所有子問題(假想地)列成一張表

1)顛倒計算方向,從lcs(a[0], b[0])出發依次計算出所有項。

遞迴公式198.house robber

題意:

你是一名專業的強盜,計畫搶劫沿街的房屋。每間房屋都藏有一定數量的金錢,唯一阻止你搶劫每間房屋的限制因素是鄰近的房屋有保安系統連線,如果在同一晚上有兩間相鄰的房屋被闖入,它將自動與**聯絡。

給出乙份代表每個房屋的金額的非負整數列表,確定你可以在沒有提醒**的情況下搶劫的最高金額。

解題思路:

第n個的房間有遞迴公式

max(n)=

max(max(n-

1), max(n-

2) + n);

int rob(vector

& nums) ;

max[0] = nums[0];

max[1] = nums[0] > nums[1] ? nums[0] : nums[1];

for(int i = 2; i < nums.size(); i++)

return max[n - 1];

}

遞迴基與遞迴方程我們可以用2*1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋乙個2*n的大矩形,總共有多少種方法?

假設第乙個小矩形豎著放,那麼剩下的就是f(3),

解題思路

如果第乙個小矩形豎著放,那麼他底下的也必須橫著放,方法數則為餘下的f(n - 1)

如果第乙個小矩形橫著放,那麼他底下的也必須橫著放,方法數則為餘下的f(n - 2)

因此可以推導出公式:f(n)=f(n-1)+f(n-2),

其中f(1)=1,f(2)=2

if(number == 0)

return

0; else

if(number == 1)

return

1; else

if(number == 2)

return

2; int a[number + 1];

a[1] = 1;

a[2] = 2;

for(int i = 3; i <= number; i++)

return a[number];

}參考:

動態規劃入門

1 用 dp 做的題大多數返回值是int boolean,求max min,不能打亂原來輸入順序。2 動態規劃有兩個重要定義,乙個叫 optimal substructure 另乙個叫 overlap subproblem 各種排序 tree 類問題中,都會用到 divide conquer 的思想...

動態規劃入門

大家可以看看這篇文章dp,哪個更容易理解就看哪個!一 動態規劃的定義 動態規劃程式設計是一種針對於解決最優化問題的一種途徑 一種方法,而不是一種特殊演算法,也就是說它沒有固定的模板。在動態規劃中,每走一步都要看看能不能最優,而且動態規劃最擅長的就是多階段問題!二 動態規劃的基本概和基本模型構成 1....

動態規劃入門

學動態規劃自然要從數字三角形開始起步,那麼我們就先從數字三角形開始。數字三角形題目 有乙個由非負整數組成的三角形,第一行只有乙個數,除了最下行之外的每個數的左下方和右下方各有乙個數,如下圖所示 3 24 10 1 4 3 2 20 從第一行的數開始,每次可以往下或往右下走一格,直到走到最下行,把沿途...