動態規劃如何去找動態轉移方程,動態規劃演算法怎麼計算?

時間 2022-01-04 16:10:08

1樓:匿名使用者

列舉就是指把一些答案先算出來,然後類似於找規律那樣,找到一般情況的技術方法,寫出狀態轉移方程。例子:這個是去年noip提高組複賽的一道題“傳紙條”,是比較經典的動規+遞推,可以看看。

描述 description

小淵和小軒是好朋友也是同班同學,他們在一起總有談不完的話題。一次素質拓展活動中,班上同學安排做成一個m行n列的矩陣,而小淵和小軒被安排在矩陣對角線的兩端,因此,他們就無法直接交談了。幸運的是,他們可以通過傳紙條來進行交流。

紙條要經由許多同學傳到對方手裡,小淵坐在矩陣的左上角,座標(1,1),小軒坐在矩陣的右下角,座標(m,n)。從小淵傳到小軒的紙條只可以向下或者向右傳遞,從小軒傳給小淵的紙條只可以向上或者向左傳遞。

在活動進行中,小淵希望給小軒傳遞一張紙條,同時希望小軒給他回覆。班裡每個同學都可以幫他們傳遞,但只會幫他們一次,也就是說如果此人在小淵遞給小軒紙條的時候幫忙,那麼在小軒遞給小淵的時候就不會再幫忙。反之亦然。

還有一件事情需要注意,全班每個同學願意幫忙的好感度有高有低(注意:小淵和小軒的好心程度沒有定義,輸入時用0表示),可以用一個0-100的自然數來表示,數越大表示越好心。小淵和小軒希望儘可能找好心程度高的同學來幫忙傳紙條,即找到來回兩條傳遞路徑,使得這兩條路徑上同學的好心程度只和最大。

現在,請你幫助小淵和小軒找到這樣的兩條路徑。

輸入格式 input format

輸入第一行有2個用空格隔開的整數m和n,表示班裡有m行n列(1<=m,n<=50)。

接下來的m行是一個m*n的矩陣,矩陣中第i行j列的整數表示坐在第i行j列的學生的好心程度。每行的n個整數之間用空格隔開。

輸出格式 output format

輸出共一行,包含一個整數,表示來回兩條路上參與傳遞紙條的學生的好心程度之和的最大值。

樣例輸入 sample input

3 30 3 9

2 8 5

5 7 0

樣例輸出 sample output

34 【問題分析】

這個題目要求我們在一個給定的矩陣中選擇不相交的兩條路徑(首尾除外,而且必須相交),使得路徑上的所有數和最大。

【演算法描述】

這類題目有兩種做法,一種是動態規劃,一種是最小費流。由於最小費流實現比較複雜,沒有什麼實際意義,所以不再贅述。

由於兩條路徑的長度相等,可以用f[k][p][q][x][y]表示在前k的長度中,兩條路徑的結束點分別在(p,q)、(x,y)的最大權值。顯然,這個狀態是滿足無後效性的,因為路徑不可以掉頭。而且同時也滿足最優性原理,因為當前這個狀態必然由若干個子狀態演變而來。

可以寫出下面的狀態轉移方程:

f[k][p][q][x][y]=max+val[p][q]+val[x][y]

這裡,val[i][j]表示第i行第j列的數字大小,要求(p,q)與(p’,q’)相鄰,(x,y)與(x’,y’)相鄰,而且(p’,q’)≠(x’,y’)。

狀態初始化為f[1][1][1][1][1]=val[1][1]。

分析一下演算法的複雜度,時間複雜度為o(n3),空間複雜度為o(n5)。由於n≤50,使得使用的空間最大可以達到1.2gb,顯然是不可以接受的,我們要對其進行優化。

一個事實是這樣的:如果知道了長度k和橫座標x,那麼可以計算出縱座標y。所以狀態可以壓縮為f[k][p][x],這樣在空間上就可以接受了。但是記錄步數需要2n+1的維度,而

2noip2008 提高組解題報告 2009-1-4

如果知道了座標,就可以算出步數,所以狀態可以更改為f[p][q][x],這樣比剛才優化過的狀態少使用了一半的空間。至此,空間上僅僅使用了488kb,可謂優化效果明顯。

【題目小結】

這道題目是2001分割槽聯賽的原題目,在曹老師的《數學建模》講義中也出現過。就難度而言並不算難題,但是很多人因為記憶體的問題而丟掉了一道題目的分數。要求我們在審題的時候要注意每一個細節。

2樓:匿名使用者

簡單的就直接找遞推公式了

難得就先想dfs然後加記憶化,也就是找子結構

不能記憶的就加到狀態裡作為列舉量

動態規劃演算法怎麼計算?

3樓:匿名使用者

動態規劃演算法:

(1)分析最優解的性質,並刻畫其結構特徵。

(2)遞迴的定義最優解。

(3)以自底向上或自頂向下的記憶化方式(備忘錄法)計算出最優值。

(4)根據計算最優值時得到的資訊,構造問題的最優解。

動態規劃與其它演算法相比,大大減少了計算量,豐富了計算結果,不僅求出了當前狀態到目標狀態的最優值,而且同時求出了到中間狀態的最優值,這對於很多實際問題來說是很有用的。動態規劃相比一般演算法也存在一定缺點:空間佔據過多,但對於空間需求量不大的題目來說,動態規劃無疑是最佳方法!

動態規劃演算法和貪婪演算法都是構造最優解的常用方法。動態規劃演算法沒有一個固定的解題模式,技巧性很強。

如何學好動態規劃,關於動態規劃演算法,哪位可以講一下自己心得體會?

做dp題不是別人講了你就會明白,關鍵要明白原理。其實明白原理也不是最最重要,最最最重要的是在做題過程中體會dp的那種思維方式。拿到一道題,首先仔細分析,看它是否有用動態規劃的的特點。比如階段性,無後效性,子問題重疊等等。知道它是一道dp之後,要用慣用思維模式去套。我介紹一種我的方法,這些方法都是要通...

如何使用js動態顯示或隱藏,如何使用js動態顯示或隱藏DIV

方法很多,最直觀的就是用js控制div的display值,例如 var div document.getelementbyid divid div.style.display none div隱藏 div.style.display block div顯示 也可以寫一段css,用css來控制div在...

js如何獲取動態的id,JS中獲取由JS動態生成的HTML控制元件的ID?

1 在我們的電腦上開啟軟體,新建一個html頁面。2 在html頁面建立一個id為xx,值為666的文字框,通過var v document.getelementbyid xx value 原生js方法來獲取文字框的值。3 在script中加上alert v 來彈框檢視原生js方法是否根據id獲取元...