題目描述
在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 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有...