入門級動態規劃 傳紙條

2021-08-20 09:54:17 字數 2004 閱讀 9578

題目簡述:

班上同學被安排做成乙個m 行nn 列的矩陣,安排在矩陣對角線的兩端的兩名同學想要通過傳紙條聯絡,紙條要經由許多同學傳到對方手裡,一名同學坐在矩陣的左上角,座標( 1,1( 1,1 ),另一名同學坐在矩陣的右下角,座標(m,n)( m,n ) 。從第一名同學傳到第二名同學的紙條只可以向下或者向右傳遞,反之則只可以向上或者向左傳遞。

傳紙條需要傳過去再傳回來,班裡每個同學都可以幫他們傳遞,但只會幫他們一次。

還有一件事情需要注意,全班每個同學願意幫忙的好感度有高有低,可以用乙個 0~100 的自然數來表示,數越大表示越好心。盡可能找好心程度高的同學來幫忙傳紙條,即找到來回兩條傳遞路徑,使得這條路徑上同學的好心程度之和最大。求解最大好心度之和?

輸入輸出格式:

輸入首先是矩陣的行數m和列數n,之後是m行和n列的資料表示班裡各位置同學的好感度,傳紙條的兩名同學好感度認為是0         輸出即為求得最優路徑的好心度之和。

同時求得兩條路線的數值之和最大,還要求不能走重複路線,好像很棘手……得想個辦法來儲存紙條每種行進可能的好心度之和,從左上到右下再回來可以看作是從左上通過兩條路線到達右下,那麼說表示當前狀態就得表示第乙個紙條的位置和第二個紙條的位置,各需要x座標和y座標。定義乙個四維陣列來表示,dp[x1][y1][x2][y2] x1,y1表示第乙個紙條;x2,y2表示第二個紙條。陣列裡儲存的就是兩個紙條當前狀態下最大好心度。

然後列舉每個可能的x1、y1、x2、y2計算對應的 dp[x1][y1][x2][y2] ,狀態轉移方程就是當前兩個位置的好心度之和加上可以到達現在位置的歷史最大值!dp[x1][y1][x2][y2]=max( dp[x1-1][y1][x2-1][y2],dp[x1-1][y1][x2][y2-1],dp[x1][y1-1][x2-1][y2],dp[x1][y1-1][x2][y2-1] )+a[x1][y1]+a[x2][y2] 。列舉時候需要注意兩個點的座標不可以相同,因為這種位置狀態不可能出現。最後輸出的結果可以是 dp[m][n-1][m-1][n]或dp[m-1][n][m][n-1] ,因為這兩個位置到終點都是一次傳遞,而且好心度不會增加,他們的值是相等的。

#include#include#define arrmax 105

int a[arrmax][arrmax];

int dp[arrmax][arrmax][arrmax][arrmax];

int max(int a,int b,int c,int d)

int main(int argc,char* argv)

printf("%d\n",dp[m][n-1][m-1][n]);

return 0;

}

*單純的列舉每一種可能性造成了太多的冗餘,就說列舉x1=1,y1=1時,x2和y2全部可能情況都計算了一遍,然而這並沒有什麼用,真正有用的只有x2=2,y2=1的情況,因為兩個紙條可以認為是從不同路線同時出發的,第一次移動只有兩種可能性,向右( 1,2 )或者向下 ( 2,1 ) 。也就是說把每一次移動所有可能位置列舉一遍即可,可以發現每次移動可能性的位置都在一條斜線上,也就是說兩個紙條每次移動後所在的座標x+y都必然是相等的,現在確定兩紙條位置只需要三個變數就可以,斜線( x+y )、兩座標的x值或者y值( 有乙個就可以通過斜線得到另乙個 )。

現在只需要列舉三層,先列舉斜線也就是列舉每一次移動,之後是兩紙條的x、y座標其中乙個。稍稍改動一下上面的程式。

#include#include#define arrmax 105

int a[arrmax][arrmax];

int dp[2*arrmax][arrmax][arrmax];

int max(int a,int b,int c,int d)

int main(int argc,char* argv)

{ int m,n;

scanf("%d%d",&m,&n);

for(int i=1;i<=m;i++)

for(int j=1;j<=n;j++)

scanf("%d",&a[i][j]);

for(int k=3;kend

動態規劃 傳紙條

這一道題的思路很簡單,暴力dp都可以過 就是用4個for 但是有可能會爆空間。先來講講暴力dp的思路吧 這一道題可以看成是求乙個人從左上角到右下角走兩次所經過路線的最大值,所以用兩個for來列舉第一次走的橫縱座標,另外兩個for來列舉第二次做的橫縱座標,一共分四種情況 1 f i j k l f i...

動態規劃 傳紙條

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

傳紙條 動態規劃

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