plants vs. zombies(
pvz)是最近十分風靡的一款小遊戲。
plants
(植物)和
zombies
(殭屍)是遊戲的主角,其中
plants
防守,而
zombies
進攻。該款遊戲包含多種不同的挑戰系列,比如
protect your brain
、bowling
等等。其中最為經典的,莫過於玩家通過控制
plants
來防守zombies
的進攻,或者相反地由玩家通過控制
zombies
對plants
發起進攻。
現在,我們將要考慮的問題是遊戲中zombies
對plants
的進攻,請注意,本題中規則與實際遊戲有所不同。遊戲中有兩種角色,plants
和zombies
,每個plant
有乙個攻擊位置集合,它可以對這些位置進行保護;而
zombie
進攻植物的方式是走到植物所在的位置上並將其吃掉。
遊戲的地圖可以抽象為乙個n行m列的矩陣,行從上到下用0
到n–1編號,列從左到右用
0到m–1編號;在地圖的每個位置上都放有乙個
plant
,為簡單起見,我們把位於第r行第c列的植物記為pr, c。
plants分很多種,有攻擊類、防守類和經濟類等等。為了簡單的描述每個
plant
,定義score和attack如下:
score[pr, c]
zombie擊潰植物pr, c可獲得的能源。若score[pr, c]為非負整數,則表示擊潰植物pr, c可獲得能源score[pr, c],若為負數表示擊潰pr, c需要付出能源 -score[pr, c]。
attack[pr, c]
植物pr, c能夠對zombie
進行攻擊的位置集合。
zombies必須從地圖的右側進入,且只能沿著水平方向進行移動。zombies
攻擊植物的唯一方式就是走到該植物所在的位置並將植物吃掉。因此zombies
的進攻總是從地圖的右側開始。也就是說,對於第r行的進攻,zombies
必須首先攻擊pr, m-1;若需要對pr, c(0≤c(r, c)才可進行攻擊。
在本題的設定中,plants
的攻擊力是無窮大的,一旦
zombie
進入某個
plant
的攻擊位置,該
zombie
會被瞬間消滅,而該zombie
沒有時間進行任何攻擊操作。因此,即便zombie
進入了乙個
plant
所在的位置,但該位置屬於其他植物的攻擊位置集合,則
zombie
會被瞬間消滅而所在位置的植物則安然無恙(在我們的設定中,
plant
的攻擊位置不包含自身所在位置,否則你就不可能擊潰它了)。
zombies的目標是對
plants
的陣地發起進攻並獲得最大的能源收入。每一次,你可以選擇乙個可進攻的植物進行攻擊。本題的目標為,制定一套
zombies
的進攻方案,選擇進攻哪些植物以及進攻的順序,從而獲得最大的能源收入。
輸入檔案pvz.in
的第一行包含兩個整數n, m,分別表示地圖的行數和列數。
接下來n×m行描述每個位置上植物的資訊。第r×m + c + 1行按照如下格式給出植物pr, c的資訊:第乙個整數為score[pr, c], 第二個整數為集合attack[pr, c]中的位置個數w,接下來w個位置資訊(r』, c』),表示pr, c可以攻擊位置第r』 行第c』 列。
輸出檔案pvz.out僅包含乙個整數,表示可以獲得的最大能源收入。注意,你也可以選擇不進行任何攻擊,這樣能源收入為0
。3 2
10 0
20 0
-10 0
-5 1 0 0
100 1 2 1
100 0
在樣例中,
植物p1,1可以攻擊位置(0,0), p2, 0可以攻擊位置(2,1)。
乙個方案為,首先進攻p1,1, p0,1,此時可以攻擊p0,0 。共得到能源收益為(-5)+20+10 = 25
。注意,
位置(2,1)
被植物p2,0保護,所以無法攻擊第2
行中的任何植物。
約20%
的資料滿足1 ≤ n, m ≤ 5;
約40%
的資料滿足1 ≤ n, m ≤ 10;
約100%
的資料滿足1 ≤ n ≤ 20,1 ≤ m ≤ 30,-10000 ≤ score ≤ 10000
裸的最大權閉合圖。
需要注意的是如果有環就肯定打不了,先拓撲排除掉那些點然後最大流
#include#include#include#include#define inf 100000000
#define min(a,b) ((a)>(b))?(b):(a)
using namespace std;
int map[25][35],head[800],in[800];
bool yes[800];
int n,k,cnt,dist[800],gap[800],edgehead[800];//雙向邊
struct pointedge[1000000];
struct edgeee[1000000];
void addedge(int u,int v,int ca)
void addedge(int u,int v)
int dfs (int p , int limit)}}
int tmp=n+1;
for(int i=edgehead[p];i!=0;i=edge[i].next)
if(--gap[dist[p]]==0 || dist[0]>n)return -1;//出現斷層或回流已滿
++gap[dist[p]=tmp];
return 0;
}int sap()
void top()
else if(map[i][j]<0)
addedge((i-1)*e+j,n,-map[i][j]);
for(p=head[(i-1)*e+j];p;p=ee[p].next)
}} printf("%d\n",sum-sap());
}
NOI2009 植物大戰殭屍
這道題跟noi2006 最大獲利其實是很像的 一樣都是要搞定一些點才能搞定另一些點,然後有些點正權有些點負權 這種問題,其實是最大權閉合子圖 amber的最小割 有詳細的講解法和證明 閉合子圖的定義是,圖中每個點所連線的的任何一條邊不指向圖外,可以有邊指向這個圖 這實際上就是乙個依賴關係,如果我們把...
NOI2009 植物大戰殭屍
這道題跟noi2006 最大獲利其實是很像的 一樣都是要搞定一些點才能搞定另一些點,然後有些點正權有些點負權 這種問題,其實是最大權閉合子圖 amber的最小割 有詳細的講解法和證明 閉合子圖的定義是,圖中每個點所連線的的任何一條邊不指向圖外,可以有邊指向這個圖 這實際上就是乙個依賴關係,如果我們把...
NOI 2009 植物大戰殭屍
傳送門 題目描述 plants vs.zombies pvz 是最近十分風靡的一款小遊戲。plants 植物 和 zombies 殭屍 是遊戲的主角,其中 plants 防守,而 zombies 進攻。該款遊戲包含多種不同的挑戰系列,比如 protect your brain bowling 等等。...