Tyvj Aug11 黃金礦工

2022-08-15 21:00:22 字數 2022 閱讀 3388

jimmy是一位**礦工,他所在的金礦是乙個n*n的矩形區域(俯視),區域內有**、石頭和tnt,由乙個 n*n的矩陣描述。**的價值對應矩陣中的正值,石頭的價值對應矩陣中的負值,tnt由0表示。換句話說,挖到**賺錢,石頭虧損,如果挖到tnt就掛了。

jimmy租到的挖礦工具很特別,它的形狀是乙個長寬任意(均為正整數)的矩形,可以取走被該工具覆蓋的矩形區域內的所有物品,但如果該區域內有tnt,該工具將被炸毀,此時jimmy將不得不賠償礦主+∞元!!!需要注意的是,該工具只能在金礦範圍內使用(即不得超出金礦邊界),且租金為每次使用十元。

現在,jimmy想知道,如果他至多只有一次租用該工具的機會,他能獲得的最大收益是多少。當然,如果jimmy租用該工具無論如何都會虧損,他可以不租用,此時收益為0.

第一行:乙個整數n

接下來n行,每行n個整數(絕對值<100),為題目中所描述的矩陣。

乙個數,即jimmy所能獲得的最大收益。

3 0 -1 -1

0 -12 0

-19 0 0

0

【樣例解釋】

無論jimmy怎麼挖礦,挖到的不是石頭,就是tnt,總之無論如何都會虧損,所以選擇不租用工具,收益為0

【資料範圍】

對於30%的資料:0<n<=10

對於60%的資料:0<n<=100

對於100%的資料:0<n<=300

動態規劃, 貪心,子矩陣dp

這是一道很好的dp題,首先這道題的模型就是求最大子矩陣和。很容易想到的暴力列舉是o(n^4)的,顯然會tle,我們發現,暴力列舉的時候我們很多東西都重複計算了,沒有很好的利用中間結果。

首先從一維的子串行最大和講起。對於任意數列,o(n)的求它最大的子串行和,設f[i]表示到i位置的最大和,那麼狀態的轉移只有兩種,如果f[i-1]>0,那麼 f[i]=f[i-1]+a[i],否則f[i]=a[i]。因為要求最大的子串行和,所以所選的子串行的起始位置一定是正數。

當f[i]>0時,這個轉移顯然是對的,(每次轉移後都會更新答案,所以a[i]<0也不會影響答案)

當f[i-1]<0時,f[i-1]+a[i]一定小於 a[i],而i-1是從上乙個起始位置開始,一段子串行中和第一次小於0的位置,同時序列的起點又是正數,所以上一次選的序列中不存在乙個位置到當前位置的序列和大於0,所以新序列從 i 位置開始。

然後模擬到二維的子矩陣和,我們可以把乙個矩形一列的和看做一維陣列的乙個元素,轉化為上面那個問題,這樣就只需列舉矩形的上下界,求和的話可以用字首和優化,記錄每一列的字首和,這樣就可以o(1)求矩形一列的和。總複雜度為o(n^3)。

還可以參見這篇部落格,博主講得很清楚。

1 #include 2 #include 

3 #include 4 #include 5 #include 6 #include 7 #include 8 #include

9 #include 10 #include 11 #include 12 #include 13 #include 14

using

namespace

std;

15#define ll long long

1617 inline int

gi()

1821

while(c>='

0' && c<='

9')

22if(b) return -r; return

r;23}24

25const

int inf = 21400000, n = 307;26

inta[n][n];

2728

intmain()

2939

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

枚舉子矩形下面邊的位置

40for (k=0; k//

枚舉子矩形上面邊的位置

4149

}50 printf("

%d\n

",max(ans-10,0

));51

return0;

52 }

leetcode 黃金礦工

你要開發一座金礦,地質勘測學家已經探明了這座金礦中的資源分布,並用大小為 m n 的網格 grid 進行了標註。每個單元格中的整數就表示這一單元格中的 數量 如果該單元格是空的,那麼就是 0。為了使收益最大化,礦工需要按以下規則來開採 每當礦工進入乙個單元,就會收集該單元格中的所有 礦工每次可以從當...

黃金礦工 回溯演算法

你要開發一座金礦,地質勘測學家已經探明了這座金礦中的資源分布,並用大小為 m n 的網格 grid 進行了標註。每個單元格中的整數就表示這一單元格中的 數量 如果該單元格是空的,那麼就是 0。為了使收益最大化,礦工需要按以下規則來開採 示例 2 輸入 grid 1,0,7 2,0,6 3,4,5 0...

力扣 黃金礦工

你要開發一座金礦,地質勘測學家已經探明了這座金礦中的資源分布,並用大小為 m n 的網格 grid 進行了標註。每個單元格中的整數就表示這一單元格中的 數量 如果該單元格是空的,那麼就是 0。為了使收益最大化,礦工需要按以下規則來開採 每當礦工進入乙個單元,就會收集該單元格中的所有 礦工每次可以從當...