NC15034 德瑪西亞萬歲(狀壓dp)

2021-10-08 19:26:58 字數 1742 閱讀 6274

德瑪西亞是乙個實力雄厚、奉公守法的國家,有著功勳卓著的光榮軍史。

這裡非常重視正義、榮耀、職責的意識形態,這裡的人民為此感到強烈自豪。

有一天他們想去制裁**的比爾吉沃特,於是派遣了自己最優秀的戰士。

結果比爾吉沃特領土太小,只有長為n寬為m共計n*m塊土地,其中有些土

地標記為0表示為高山峻嶺或者深海湖泊,英雄們無法在其中站立,只有標

記為1的土地才能容納乙個英雄。德瑪西亞的英雄們戰鬥時有乙個特點,他

們不希望隊友站在自己旁邊顯得很曖昧。請問最多能有多少種安排德瑪西

亞英雄的方法?

輸入包含多組測試資料;

每組資料的第一行包含2個整數n和m (n <= 12, m <= 12 ),之間用空格隔開;

接下來的n行,每行m個數,表示n*m的比爾吉沃特領土。

輸出乙個整數n代表安排應用的方法。

(答案取膜100000000)

3 31 1 1

0 1 1

1 0 0

直覺動態規劃,一行一行遞推,看資料範圍猜狀壓dp。dp[

i][s

]dp[i][s]

dp[i][

s]表示第 i

ii 行狀態為 s

ss 的方案數,第二維的 s

ss 用二進位制01表示這一行的所有位置的狀態,0表示沒人,1表示有人。

從上一行遞推到下一行,首先當前這一行上狀態 s

ss 要滿足不相鄰,即(s & (s >> 1)) == 0,而且還要滿足這一行上的地形條件(0不能站人,1才能站人),即(s & a[i]) == s,這裡 a[i

]a[i]

a[i]

也是用二進位制01表示了一整行的狀態,需要提前處理。

當這個狀態 s

ss 滿足上述條件後,就可以從上一行的所有狀態 s′s'

s′轉移到當前狀態 s

ss,需要滿足同一列上不能同時有人,即(s & s') == 0,dp[

i][s

]=∑d

p[i−

1][s

′]

dp[i][s]=\sum

dp[i][

s]=∑

dp[i

−1][

s′]。

#include

using

namespace std;

const

int mod =

100000000

;int n, m;

int a[15]

;int dp[15]

[1<<15]

;//第二維表示這一行的所有位置的狀態,用二進位制01表示

intmain()

}memset

(dp,0,

sizeof

(dp));

for(

int i =

1; i <= n; i++)}

}}}}

int ans =0;

for(

int i =

0; i <(1

<< m)

; i++

) ans =

(ans + dp[n]

[i])

% mod;

cout << ans << endl;

}return0;

}

nc 監聽資料 linux包之nc之nc命令

nc 1.84 22.el6.x86 64 不用系統上提供的nc版本會有所不同,其提供的引數使用方法也略有差異 nc v w 1 192.168.2.10 z 1 65535 grep succeeded 埠掃瞄 1.4 強制使用ipv4 2.6 強制使用ipv6 3.d 允許socket通訊返回d...

nc命令介紹

名字 nc 連線 監聽任意的tcp和udp。概要 nc 46ddhklnrstuuvzc i 間隔 p 源埠 s 源ip位址 t 服務型別 w 超時時間 x 協議 x 位址 埠 主機名 埠 s 詳細說明 nc netcat 的功能使用是涉及到tcp或者udp的時候。它可以開啟tcp連線,傳送udp包...

nc命令說明

一,什麼是nc nc是netcat的簡寫,因為它短小精悍 功能實用,被設計為乙個簡單 可靠的網路工具 二,nc的作用 1 實現任意tcp udp埠的偵聽,nc可以作為server以tcp或udp方式偵聽指定埠 2 埠的掃瞄,nc可以作為client發起tcp或udp連線 3 機器之間傳輸檔案 4 機...