[蓝桥杯][算法训练VIP]方格取数(双线程dp)
題目描述
設有N * N的方格圖(N< =10),我們將其中的某些方格中填入正整數,而其他的方格中則放入數字0。
某人從圖的左上角的A 點(1,1)出發,可以向下行走,也可以向右走,直到到達右下角的B點(N,N)。在走過的路上,他可以取走方格中的數(取走后的方格中將變為數字0)。
此人從A點到B 點共走兩次,試找出2條這樣的路徑,使得取得的數之和為最大。
輸入
輸入的第一行為一個整數N(表示N*N的方格圖),接下來的每行有三個整數,前兩個表示位置,第三個數為該位置上所放的數。一行單獨的0表示輸入結束。
輸出
只需輸出一個整數,表示2條路徑上取得的最大的和。
樣例輸入
8
2 3 13
2 6 6
3 5 7
4 4 14
5 2 21
5 6 4
6 3 15
7 2 14
0 0 0
樣例輸出
67
思路:一開始想的就是走兩次,每一次都盡量取最大的,這么走,但是這樣不對,為什么呢?如圖所示(自動補齊):
如果按照一開始的想法來的話,第一次我們選的是2 3 3 4 4 4;第二次就是3了。這樣兩次一共是23.但是如果第一次取2 3 3 2 4 ,第二次取3 4 4 的話,這樣就可以全取了,最終答案是25 ,這樣是最優的。
也就是說我們不能將兩次路程分開來計算,而是要一起走。假設有兩個人一同從(1,1)走,最終到達(n,n)。開一個四維的dp數組(我們可以發現n最大只有10,數據量很小),記憶化搜索找出最優答案就可以了。
代碼如下:
努力加油a啊,(o)/~
總結
以上是生活随笔為你收集整理的[蓝桥杯][算法训练VIP]方格取数(双线程dp)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑d盘无法格式化如何解决
- 下一篇: kvm切换器的作用是什么