洛谷 P2380 狗哥採礦 線性dp

2021-09-26 12:17:29 字數 1264 閱讀 1639

又是一節平靜的語文課

狗哥閒來無事,出來了這麼一道題

乙個n*m的矩陣中,每個格仔內有兩種礦yeyenum和bloggium,並且知道它們在每個格仔內的數量是多少。最北邊有bloggium的收集站,最西邊有 yeyenum 的收集站。現在要你在這些格仔上面安裝向北或者向西的傳送帶(每個格仔只能裝一種)。問最多能採到多少礦?

第一行包含兩個整數n,m,( 1 ≤ n ≤ 500, 1 ≤ m ≤ 500)。接下來n行m列,表示每個格仔中可以傳送到yeyenum的數量(小於1000),再接下來n行m列,表示每個格仔中可以傳送到bloggium的數量。n, m 同時為0結束。

每組測試資料僅輸出乙個數,表示最多能採到的礦。

輸入 #1複製

4 4

0 0 10 9

1 3 10 0

4 2 1 3

1 1 20 0

10 0 0 0

1 1 1 30

0 0 5 5

5 10 10 10

0 0

輸出 #1複製

98
傳輸過程中不能轉彎,只能走直路。

令dp[i][j]為以點(i,j)為右下角時的矩陣中最大採礦量。由於傳送帶不能轉彎,所以在點(i,j)上,向左就會一直向左,向上就會一直向上。所以點(i,j)如果向左挖礦,可以從點(i,j-1)轉移過來,而(i,j-1)也可以從點(i,j-2)轉移過來,一直到(i,1)。同理,點(i,j)如果向上挖礦,可以從點(i-1,j)轉移過來,而(i-1,j)也可以從點(i-2,j)轉移過來,一直到(1,j)。

在挖礦的過程中,能影響dp[i][j]的值只有挖礦方向。用a[i][j]來記錄向上的礦的字首和,用b[i][j]來記錄向左的礦的字首和。則:

dp[i][j]=max(dp[i][j-1]+a[i][j],dp[i-1][j]+b[i][j])

答案為dp[n][m]。

#include #include #include #define maxn 501

using namespace std;

int n,m,a[maxn][maxn],b[maxn][maxn],dp[maxn][maxn],inf;

signed main()

} for(i=1;i<=n;i++)

}for(i=1;i<=n;i++)

}cout<>n>>m;

} return 0;

}

洛谷 P2380 狗哥採礦

又是一節平靜的語文課 狗哥閒來無事,出來了這麼一道題 乙個n m的矩陣中,每個格仔內有兩種礦yeyenum和bloggium,並且知道它們在每個格仔內的數量是多少。最北邊有bloggium的收集站,最西邊有 yeyenum 的收集站。現在要你在這些格仔上面安裝向北或者向西的傳送帶 每個格仔只能裝一種...

洛谷 P2383 狗哥玩木棒

狗哥又趁著語文課幹些無聊的事了.現給出一些木棒長度,那麼狗哥能否用給出的木棒 木棒全用完 組成乙個正方形呢?輸入格式 輸入檔案中的第一行是乙個整數n表示測試的組數,接下來n行表示每組的測試資料。每行的第乙個數為m 4 m 20 接下來m個數ai 1 ai 1000 表示木棒的長度。輸出格式 對於每組...

洛谷 P1970 花匠 線性dp

花匠棟棟種了一排花,每株花都有自己的高度。花兒越長越大,也越來越擠。棟棟決定把這排中的一部分花移走,將剩下的留在原地,使得剩下的花能有空間長大,同時,棟棟希望剩下的花排列得比較別緻。具體而言,棟棟的花的高度可以看成一列整數h 1,h 2,h nh1 h2 hn 設當一部分花被移走後,剩下的花的高度依...