題目描述 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行足矣。
#includeusingview codenamespace
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]);
}
指令碼批量處理,一起行啟動多個軟體。
每天開機都要開啟這麼多的軟體。非常煩。直接寫個指令碼批量處理。雙擊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元。請誰呢?記住,請比你有思想的...