第一行兩個整數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;(ps:這道題本人還不是理解的特別透徹,只是大致理解了思路和做法,**的內容還要細細鑽研琢磨。)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 }
狀壓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表示本行...