ACM 穿越矩陣

2021-08-26 21:22:49 字數 1556 閱讀 3614

現在有乙個 m * n 的整數矩陣,請你編寫乙個程式計算出一條從左到右穿過矩陣的路徑,並使此路徑的費用最小。路徑從矩陣的左側的第一列的任意單元格開始,逐步穿過矩陣到達最右側的一列的任意單元格。每一步是指從某單元格進入它一列的相鄰單元格(如下圖,可以是橫向或斜向)。矩陣的第一行和最後一行實際是相鄰的,你可以想象矩陣是包裹在乙個橫放的圓柱體外面。

路徑的花費是指這條路徑所穿越的所有單元格中的數字之和。

穿越兩個略有不同的 5 * 6 的矩陣的路徑如下圖所示,這兩個矩陣只有最後一行的數字不同。右側的路徑顯示了第一行和最後一行相鄰的效果。

輸入包括一系列矩陣描述。每個矩陣描述的第一行是 m 和 n,即矩陣的行數和列數;之後的 m 行,每行包括 n 個以空格分開的整數,則是當前矩陣的值,注意矩陣的值未必是正數。

矩陣的行數 m 和列數 n 的範圍是:1 <= m <= 10、 1 <= n <= 100;所有路徑的費用值都可以用 30bit 的整數表示。

針對每乙個矩陣,找出費用最小的路徑,並將其輸出。每個矩陣的輸出包括兩行,第一行是路徑本身,即輸出每一步所在的行,第二行則是該路徑的費用。

如果對於同乙個矩陣有多條不同的費用最小路徑,則輸出左端行號較小的一條。

uva: 116

測試輸入

期待的輸出

時間限制

記憶體限制

額外程序

測試用例 1

以文字方式顯示

56↵341286↵

618274↵

593995↵

841326↵

372864↵

56↵341286↵

618274↵

593995↵

841326↵

372123↵

以文字方式顯示

123445↵

16↵121545↵

11↵1秒1024kb

0遞迴的解法:

#include #define m 12 #define n 110 int matrix[m][n], m, n, mincost, arr[n]; void cross(int i, int j, int sum, int tem[n]) } else if (sum < mincost) } } void entry() ;//存放路徑點 cross(i, 0, 0, tem);//依次將每一行的第一列做為路徑的入口點 } } int main() entry(); for (int i = 0; i < n; i++) printf("\n%d\n", mincost); } return 0; }

然而,這並不是乙個很好的解法,當矩陣列數超過10時會超過時間限制!

非遞迴解法:(採用動態規劃)

#include #define m 12 #define n 110 int matrix[m][n], m, n, minrow,mincol; int minvalue(int i, int j) //求matrix[i][j]有方上、中、下三個數的最小數,同時要把行標記錄下來 void crossmatrix() for (j = 0; j < n; j++) printf("\n%d\n",min); } int main() return 0; }

穿越矩陣 15分 動態規劃

題目內容 現在有乙個 m n 的整數矩陣,請你編寫乙個程式計算出一條從左到右穿過矩陣的路徑,並使此路徑的費用最小。路徑從矩陣的左側的第一列的任意單元格開始,逐步穿過矩陣到達最右側的一列的任意單元格。每一步是指從某單元格進入它一列的相鄰單元格 如下圖,可以是橫向或斜向 矩陣的第一行和最後一行實際是相鄰...

矩陣連乘問題 動態規劃 ACM

題目描述 給定n個矩陣 a1,a2,an 其中,ai與ai 1是可乘的,i 1,2 n 1 用加括號的方法表示矩陣連乘的次序,不同的計算次序計算量 乘法次數 是不同的,找出一種加括號的方法,使得矩陣連乘的次數最小。例如 a1是a 5 10 的方陣 a2是a 10 100 的方陣 a3是a 100 2...

BIT2014級軟體學院程式設計 20 穿越矩陣

20 穿越矩陣 現在有乙個 m n 的整數矩陣,每一格上有乙個數字。請你編寫乙個程式計算出一條從左到右穿過矩陣的路徑,並使此路徑的費用最小。路徑的花費是指這條路徑所穿越的所有單元格中的數字之和。路徑從矩陣的左側的第一列的任意單元格開始,逐步穿過矩陣到達最右側的一列的任意單元格。每一步是指從某單元格進...