掃瞄透鏡 貪心 動歸

2021-07-16 17:47:15 字數 2151 閱讀 1771

題目描述

在n*m的草地上,提莫種了k個蘑菇,蘑菇**的威力極大,蘭博不想貿然去闖,而且蘑菇是**的.只 有一種叫做掃瞄透鏡的物品可以掃瞄出**的蘑菇,於是他回了一趟戰爭學院,買了2個掃瞄透鏡,乙個 掃瞄透鏡可以掃瞄出(3*3)方格中所有的蘑菇,然後蘭博就可以清理掉一些**的蘑菇. 問:蘭博最多可以清理多少個蘑菇?

注意:每個方格被掃瞄一次只能清除掉乙個蘑菇。

輸入描述:

第一行三個整數:n,m,k,(1≤n,m≤20,k≤100),n,m代表了草地的大小;

接下來k行,每行兩個整數x,y(1≤x≤n,1≤y≤m).代表(x,y)處提莫種了乙個蘑菇.

乙個方格可以種無窮個蘑菇.

輸出描述:

輸出一行,在這一行輸出乙個整數,代表蘭博最多可以清理多少個蘑菇.

樣例輸入

14 8 47

11 5

7 2

1 1

12 4

8 7

13 2

6 54 5

1 5

5 3

4 1

5 3

7 8

3 3

4 3

3 7

5 2

10 8

11 7

1 7

11 6

12 8

13 2

2 8

10 2

12 4

10 2

1 5

5 8

12 5

10 8

4 5

1 6

8 6

10 3

4 8

8 2

3 4

14 8

4 8

12 8

11 6

12 1

10 3

5 2

8 1

6 6

樣例輸出

9

注意題目的描述

ac**如下,待優化

#include 

#include

#include

#include

#include

using

namespace

std;

/* mp是引用,每次掃瞄要修改 */

int func(vector

> &mp, int n, int m)

}maxval = dp[1];

posx = 1;

posy = 1;

for (int i = 2; i <= n - 2; i++)

dp[i] = dp[i - 1] - tmp1 + tmp2;

if (dp[i] > maxval)

maxval = dp[i];

}// 計算依次計算後面每一行的值 即 j = 2, 3 , ... m - 2 , 每一行依賴於上一行dp

for (int j = 2; j <= m - 2; j++)

dp[i] = dp[i] - tmp1 + tmp2; // 更新dp[i]

if (dp[i] > maxval)

}// end for i

}// end for j

// 得到了最大的方格後,蘑菇數減去1,等待下乙個蘑菇

for (int i = posx; i <= posx+2; i++)

}return maxval;

}int main()

if (n < 3)

n = 3;

if (m < 3)

m = 3;

vector

> mp(n+1, vector

(m+1, 0));

int x, y;

for(int i = 0; i < k; i++)

int rs = 0;

rs += func(mp,n,m);

rs += func(mp, n, m);

printf("%d\n", rs);

}return

0;}

牛客網 貪心 掃瞄透鏡

在n m的草地上,提莫種了k個蘑菇,蘑菇 的威力極大,蘭博不想貿然去闖,而且蘑菇是 的.只 有一種叫做掃瞄透鏡的物品可以掃瞄出 的蘑菇,於是他回了一趟戰爭學院,買了2個掃瞄透鏡,乙個 掃瞄透鏡可以掃瞄出 3 3 方格中所有的蘑菇,然後蘭博就可以清理掉一些 的蘑菇.問 蘭博最多可以清理多少個蘑菇?注意...

POJ 2392 貪心,動規

需要按每個模組的允許高度公升序排序,然後動規求出結果。一開始只是單純的排序,無法得到最優結果。自己動規的意識還很差。include include include includeusing namespace std struct nodearr 405 bool cmp node x,node y...

攔截飛彈(貪心 動態)

時間限制 1000 ms 記憶體限制 65536 kb 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有...