狀壓dp Bzoj1294 圍豆豆

2022-02-02 06:52:25 字數 1581 閱讀 3300

第一行兩個整數n和m,為矩陣的邊長。 第二行乙個整數d,為豆子的總個數。 第三行包含d個整數v1到vd,分別為每顆豆子的分值。 接著n行有乙個n×m的字元矩陣來描述遊戲矩陣狀態,0表示空格,#表示障礙物。而數字1到9分別表示對應編號的豆子。

僅包含乙個整數,為最高可能獲得的分值。

3 83

30 -100 30

00000000

010203#0

00000000

50%的資料滿足1≤d≤3。 100%的資料滿足1≤d≤9,1≤n, m≤10,-10000≤vi≤10000。

首先考慮一下點被包圍的情況,在網上看到了一種不錯的方法,也就是射線法。也就是從乙個點向右做一條射線,如果與路線的交點個數為奇數,則這個點一定被圍起來了。下邊有幾個圖加強一下理解:

到這裡我們可以看到如果交點奇數個,那麼這個點就是被圍起來的,反之則沒有被圍起來。

這個是一種特殊的情況,如果兩條相交的邊是同向的,那麼也有可能包圍這個點。於是乎我們就可以將射線向下移動半格。

因為這個轉移是存在環的,所以選擇spfa

1 #include 2 #include 3 #include 4 #include 5 using namespacestd;

6 const int maxn=(1<<9)+3;

7 int f[10][10][maxn],val[maxn];

8 int inq[10][10][maxn],v[10],tr[10][10],dx=,dy=;

9 char s[10][10];

10 queueq1,q2,q3;

11 intn,m,k,ans;

12 intmain()

13 23 }//射線法找圍住的點

24 for(i=0;i)

31 }//spfa

32 for(i=0;i)

33 for(j=0;j)

34 if(s[i][j]=='0')

43 for(k=0;k<4;k++)

53 }

54 }

55 }

56 printf("%d",ans);

57 return 0;

58 }

(ps:這道題本人還不是理解的特別透徹,只是大致理解了思路和做法,**的內容還要細細鑽研琢磨。)

狀壓DP bzoj1087 互不侵犯king

在n n的棋盤裡面放k個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上 下 左 右,以及左上 左下 右上 右下八個方向上附近的各乙個格仔,共8個格仔。只有一行,包含兩個數n,k 1 n 9,0 k n n 方案數3 2 原題鏈結 bzoj1087 scoi2005 互不侵犯king 其實...

狀壓dp 玉公尺田 狀壓dp

相關 強相關 327.玉公尺田 狀壓dp 小國王 狀壓dp 是井字形,本題是十字形。思路 狀態計算 時間複雜度 n 2 n 2n o n 22n 12 2 24n 2 n 2 n o n2 12 2 n 2n 2 n o n22n 12 224 看著妥妥超時,但是裡面合法狀態很少 依舊可以過 在此,...

狀壓dp小記

鋪磚 題意 現有nm的一塊地板,需要用12的磚塊去鋪滿,中間不能留有空隙。問這樣方案有多少種 include using namespace std typedef long long ll const int maxn 1 11 int n,m,state ll dp 15 maxn s1表示本行...