多執行緒DP (要一起行動才可以)

2022-05-01 11:33:11 字數 1695 閱讀 6479

題目描述 description

設有n*n的方格圖(n<=10,我們將其中的某些方格中填入正整數,而其他的方格中則放入數字0。如下圖所示(見樣例):

某人從圖的左上角的a 點出發,可以向下行走,也可以向右走,直到到達右下角的b點。在走過的路上,他可以取走方格中的數(取走後的方格中將變為數字0)。

此人從a點到b 點共走兩次,試找出2條這樣的路徑,使得取得的數之和為最大。

輸入描述 input description

輸入的第一行為乙個整數n(表示n*n的方格圖),接下來的每行有三個整數,前兩個表示位置,第三個數為該位置上所放的數。一行單獨的0表示輸入結束。

輸出描述 output description

只需輸出乙個整數,表示2條路徑上取得的最大的和。

樣例輸入 sample input

82  3  13

2  6   6

3  5   7

4  4  14

5  2  21

5  6   4

6 3  15

7 2  14

0 0  0

樣例輸出 sample output

67路一:

我們設f[i,j,k,l]表示第一條路走到(i,j),第二條路走到(k,l)的路線。

那麼狀態轉移方程很好得出:

f[i,j,k,l]=max+(i==k&&j==l ? a[i][j] : a[i][j]+a[k][l])

值得注意的是:最後加上這個值的時候要注意如果路徑走到同一點不能重複統計。

時間複雜度:o(n4),空間複雜度o(n4),對於本題n<=10完全足夠。

思路二:

雖然思路一對於本題完全足夠,但是如果n的範圍大些的話,就無法辦到了。

針對思路一,我們發現了問題,有一些狀態是可以合併的,最重要的是:思路一,我們是同時開始走的,那麼不必記錄向右、向下的具體路徑,只需要記錄步數,顯然,兩條路的步數是統一的,然後再記錄向下或向右的次數,就能根據這兩者推算出向下或向右的次數。

那麼設f[i,j,k]表示走到了第i步,第一條路徑向走了j步,第二條路徑向走了k步。

那麼f[i,j,k]=max+(j==k ? a[i-j+1][i] : a[i-j+1][j]+a[i-k+1][k]);

顯然,我們也要判斷路徑是否走到同一點,所以有後面的那個if( ? : 三目運算子)

時間複雜度:o(2n3),空間複雜度o(2n3),優化了一維。從n的四方優化至n的三方,是乙個很大的進步。

至於**,只要思路知道了,就無所謂了。

因為的線性的原因所以可以開二維

**複雜度不高,50行足矣。

#includeusing

namespace

std ;

int g[20][20],dp[20][20

];int

main( )

for(int k=1 ; k<=2*n-1 ; k++)}}

printf(

"%d\n

",dp[n][n]);

}

view code

指令碼批量處理,一起行啟動多個軟體。

每天開機都要開啟這麼多的軟體。非常煩。直接寫個指令碼批量處理。雙擊ok。提高效率,節約時間。echo off echo starting myeclipse start min d myeclipse 8.6 myeclipse.exe echo starting idea64 start min ...

多執行緒和事物管理一起使用的問題

昨天在寫多執行緒呼叫spring的jdbc來運算元據庫時,發現了個問題,所以今天在此記錄一下,可能日後隨著認知的增漲,會解決它。首先,實現runnable介面封裝了個多執行緒的類,然後,在類中引用spring配置好的jdbctemplate bean,測試到jdbc查詢的地方,拋了異常 pool n...

我們要永遠在一起

幫你愛的人買禮物。你賺錢為了什麼?而且,乙個真正愛你的人是不會亂花你的錢的。我衣服穿漂亮點你也有面子啊 使用者名稱和密碼是 guest1 1234567 第乙份,用來做生活費。第二份,用來交朋友,擴大你的人際圈。你的 費可以用掉100元。每個月可以請客兩次,每次150元。請誰呢?記住,請比你有思想的...