#41765: 解法 ( 又是記憶體在搞 )


lbm00138 (#include stdio.h)

學校 : 臺北市立成淵高級中學
編號 : 270386
來源 : [61.71.41.184]
最後登入時間 :
2024-10-23 23:12:02
l924. P.7 搜集寶藏 (Treasure) -- 2023年8月TOI新手同好會 | From: [61.71.41.184] | 發表日期 : 2024-08-24 23:16

 如果拿到 NA (score:90%)  的人 ,可能是因為有兩筆測資  RE : 記憶體區段錯誤

記得不要直接開 nm 的陣列  ( 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 ],也就是從左上角走到右下角走過的數字總和的最大值。

 
ZeroJudge Forum