如果拿到 NA (score:90%) 的人 ,可能是因為有兩筆測資 RE : 記憶體區段錯誤 |
記得不要直接開 n * m 的陣列 ( 2000 * 2000 記憶體可能承受不住 ),這題一邊輸入一邊做動態規劃為佳。
題目可以理解為走一個表格只能往右或往下走,求出左上角走到右下角走過的數字總和的最大值。
動態規劃步驟 :
若 n = 1 ,直接把整個陣列加起來就是答案。
若 n != 1,要做動態規劃如下 :
開設兩陣列 aa[m] bb[2][m],aa為輸入陣列,bb為動態規劃陣列。
首先先輸入第一行到 aa[ j ],然後複製到 bb[0][ j ] 及 bb[1][ j ]
接著進行 n-1 次 dp :
輸入第 i 行到 aa[ j ] ( 2 <= i <= n , 0 <= j < m )
bb[1][ 0 ]=bb[0][ 0 ]+aa[0]
比較 bb[ 0 ][ j ] 與 bb[ 1 ][ j-1 ] 的大小 ,bb[1][ j ] = 比較大的那個數 + aa[ j ] ( 1 <= j < m ) 意思是求出到達第 i 列第 ( j+1 ) 行以前的最佳解。
( 因為每到一個點時只能走右方或下方,所以到達第 i 列第 ( j+1 ) 行的最佳解,必等於到達第 i 列第 j 行或第 ( i - 1 ) 列第 ( j +1 ) 行最佳解中比較大 的那個加上第 i 列第 ( j+1 ) 行那個位置的數字 )
接著把 bb[1][ j ] 的資料複製到 bb[0][ j ] ( 0 <= j < m , 意思是更新上一筆動態規劃的結果,針對下一行進行動態規劃。可以理解為換下一行分析 )
最後輸出 bb[ 1 ][ m-1 ],也就是從左上角走到右下角走過的數字總和的最大值。