战略游戏 树形DP
題意/Description:
Bob喜歡玩電腦游戲,特別是戰略游戲。但是他經常無法找到快速玩過游戲的辦法。現在他有個問題。他要建立一個古城堡,城堡中的路形成一棵樹。他要在這棵樹的結點上放置最少數目的士兵,使得這些士兵能了望到所有的路。注意,某個士兵在一個結點上時,與該結點相連的所有邊將都可以被了望到。?
請你編一程序,給定一樹,幫Bob計算出他需要放置最少的士兵。
?
讀入/Input:
? ?輸入文件中數據表示一棵樹,描述如下:?
第一行 N,表示樹中結點的數目。?
第二行至第N+1行,每行描述每個結點信息,依次為:該結點標號i,k(后面有k條邊與結點I相連),接下來k個數,分別是每條邊的另一個結點標號r1,r2,...,rk。?
對于一個n(0 < n <= 1500)個結點的樹,結點標號在0到n-1之間,在輸入文件中每條邊只出現一次。?
?
輸出/Output:
? ?輸出文件僅包含一個數,為所求的最少的士兵數目。?
例如,對于如右圖所示的樹:?
答案為1(只要一個士兵在結點1上)。?
?
題解/solution:
? 這題顯然是一道樹型DP,不但要考慮子節點對他的根節點的影響,而且每放一個士兵,士兵所在位置既影響他的子節點也影響了他的根節點,狀態不難表現出來。
? ? ? 我在做的時候,WA了幾次。主要是n是從0開始的,大家在循環是要注意一下,否則會忽略‘0’這個結點。
?
代碼/Code:
?
<strong>varn:longint;g:array [0..1501,0..1501] of boolean;v,f:array [0..1501] of boolean; function hh(x:longint):boolean; vari:longint; beginfor i:=0 to n-1 doif (x<>i) and (g[x,i]) then exit(false);exit(true); end;function tree(t:longint):longint; vari,j,k,l:longint; beginj:=0; k:=0; l:=0;for i:=0 to n-1 doif (i<>t) and (g[t,i]) thenif hh(i) then inc(j) elsebeginl:=l+tree(i);if not v[i] then inc(k);end;if (j>0) or (k>0) thenbeginv[t]:=true;exit(l+1);end else exit(l); end;procedure main; vari,j,k,l,r,ri:longint; beginread(n);for j:=0 to n-1 dobeginread(k,l);for r:=1 to l dobeginread(ri);g[k,ri]:=true;f[ri]:=true;end;end;for j:=0 to n-1 doif (f[j]=false) then break;if hh(j) then write('1')else write(tree(j)); end;beginmain; end. </strong>?
轉載于:https://www.cnblogs.com/zyx-crying/p/9319711.html
總結
- 上一篇: 定开型理财是什么意思
- 下一篇: 农行随薪贷是否可以提前还款 办理要满足