題目要求:
給定乙個?∗?的矩陣,每個單元都有乙個值,現在從左上走到右下再回到左上,中間不走重複的點,求所走單元的和的最大值。
主要思路:
本題是求從矩陣左上角走到右下角再回到左上角,該路徑的最大值,並且要求中間不走重複的點。先定義乙個陣列a[100][100]用來儲存每個單元的值。如果按照題目要求去尋找路徑,走的方向是不一樣的,比較難於區分是否走過重複的點,所以將該題轉化為從矩陣左上角到右下角,找出兩條不同的路徑,使得相加得到的值最大。
所以定義乙個陣列f[x1][y1][x2][y2],表示第一條路走到(x1,y1),第二條路走到(x2,y2)時候的最大值。一開始我寫的狀態方程是f[x1][y1][x2][y2]=max(f[x1-1][y1][x2][y2], f[x1][y1-1][x2][y2],f[x1][y1][x2-1][y2],dp[x1][y1][x2][y2-1])+a[x][y],但是這種情況下還會有重複的路徑存在,看了一些資料之後我知道,這樣的原因是因為狀態轉移方程在設計的時候,沒有考慮到階段性,兩條路徑沒有同時出發,例如,對於f[2][2][3][3],它有可能經過了f[1][1][3][3],而f[1][1][3][3]又有可能經過了f[1][1][2][2],這樣,(2,2)這個座標既出現在了第一條路裡,又出現在第二條路裡。經過對狀態轉移方程稍作改動:f[x1][y1][x2][y2]=max(f[x1-1][y1][x2-1][y2],f[x1-1][y1][x2][y2-1],f[x1][y1-1][x2-1][y2],f[x1][y1-1][x2][y2-1])+a[x1][y1]+a[x2][y2]使得此時兩條路的選擇是同步的,以上四個f陣列分別對應了到達(x1,y1,x2,y2)的四種情況。還可以發現乙個規律:對於所有步數為s可以到達的座標,x+y=s+2。所以,當兩條路同步時,有x1+y1=x2+y2,變形一下,x1+y1-x2=y2
還有乙個問題,如果兩條路相交後,必然會存在重複的點。如在兩個交叉點之間有兩條路,我們可以交換兩條路,而對於兩個交叉點,讓其中一條路繞一下,繞過這個重複的點,這樣做,不僅可以使得兩條圖不存在重複的點,而且值還增大了,我們也可以反推出存在兩個交叉點的路必定不是我們要找的路,還有比他更大的,所以完全沒有必要考慮路徑的交叉情況。
通過迴圈呼叫上述狀態轉移方程,不斷將最大值記錄到f[x1][y1][x2][y2]中,因為兩條路要不同,所以一條由[n-1][m]即右下角的上方,一條由[n][m-1]即右下角的左邊到達右下角,最後輸出f[n][m-1][n-1][m]即為兩條路的相加和的最大值。
//儲存每個單元的值
int f[
100]
[100][
100]
[100];
//f[x1][y1][x2][y2],表示第一條路走到(x1,y1),第二條路走到(x2,y2)時候的最大值。
intmax
(int a,
int b,
int c,
int d)
//四個數中取最大
intmain()
}//轉移方程,找到最優解
for(
int i=
1;i<=n;i++
)for
(int j=
1;j<=m;j++
)for
(int k=
1;k<=n;k++
)for
(int l=j+
1;l<=m;l++
) f[i]
[j][k]
[l]=
max(f[i-1]
[j][k-1]
[l],f[i-1]
[j][k]
[l-1
],f[i]
[j-1
][k]
[l-1
],f[i]
[j-1
][k-1]
[l])
+a[i]
[j]+a[k]
[l];
//轉移方程
cout<<
"兩條路的所走單元的和的最大值為:"
<
[m-1
][n-1]
[m]<
//目標狀態,因為兩條路要不同,所以一條由[n-1][m]即右下角的上方,一條由[n][m-1]即右下角的左邊到達右下角
return0;
}
演算法 矩陣中的路徑2
public class solution return false matrix一維陣列 rows矩陣的行 cols矩陣的列,該點所在當前位置的行和列rowindex colindex str要尋找的字串 k字串的那個位置,flag該點有沒有下過 public boolean judge char...
檔案內指標移動
大前提 檔案內指標的移動是bytes為單位的,唯獨t模式下的read讀取內容個數是以字元為單位 f.seek 指標移動的位元組數,模式控制 控制檔案指標的移動 模式控制 0 預設的模式,該模式代表指標移動的位元組數是以檔案開頭為參照的 1 該模式代表指標移動的位元組數是以當前所在的位置為參照的 2 ...
控制檔案內指標移動
一 f.seek 位元組個數,模式 模式有三種 0 參照檔案的開頭 1 參照當前所在的位置 2 參照檔案末尾的位置 注意 1 無論何種模式,都是以位元組單位移動,只有t模式下的read n 的n代表的是字元個數 with open a.txt mode rt encoding utf 8 as f ...