矩陣內移動路徑2

2021-10-12 01:29:07 字數 2302 閱讀 5853

題目要求:

給定乙個?∗?的矩陣,每個單元都有乙個值,現在從左上走到右下再回到左上,中間不走重複的點,求所走單元的和的最大值。

主要思路:

本題是求從矩陣左上角走到右下角再回到左上角,該路徑的最大值,並且要求中間不走重複的點。先定義乙個陣列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 ...