POJ 3654 Corn Fields 狀態壓縮

2021-07-29 13:00:39 字數 1645 閱讀 3529

最近我總是輾轉反側,難以入眠,對我們曾有過的願景,浮想聯翩。但親愛的,我早已在內心深處祈禱著,祈禱自己不再迷失於金錢的追逐中。
ok,刷動態規劃題。

題意如下:

n行m列

乙個矩陣裡有很多格仔,每個格仔有兩種狀態,可以放牧和不可以放牧,可以放牧用1表示,否則用0表示,在這塊牧場放牛,要求兩個相鄰的方格不能同時放牛,即牛與牛不能相鄰。問有多少種放牛方案(一頭牛都不放也是一種方案)n,m範圍不超過12。

sample input

2 3

1 1 1

0 1 0

sample output

9 資料解釋:

將資料看為

1 2 3

0 4 0

則可行方案有(1),(2),(3),(4),(1 ,3),(1,4),(3,4),(1,3,4),()空表示什麼也不放。

這道題很明顯是狀態壓縮,因為n和m範圍就可以明顯看出來了。

怎麼設計狀態呢。

我們用dp[i][j]表示i行j狀態可行的最大方案。

那麼下一行dp[i+1][j]就應該為上一行所有可行方案的和。

即dp[i+1][j]= sigma (dp[i][k])k應為可行的方案。

詳細介紹請看**。

#include "cstdio"

using namespace std;

const int mod = 100000000;

int n, m, state[600], top, dp[13][600], a, cur[13], ans;//state陣列儲存單行中合法狀態(即沒有兩隻牛在一起的狀態),dp[i][j]表示第i行state[j]狀態可獲得最大方案。cur[i]來儲存第i行中的0(若第j個為0則給那一位打上1)

bool ok( int

x )

bool fit( int

x, int i )

int main()

int zt = (1

if ( ok(j) ) state[++top] = j;

for ( int j = 1; j <= top; j++ )

if ( fit(state[j], cur[1]) ) dp[1][j] = 1;

for ( int i = 2; i <= n; i++ )

for ( int j = 1; j <= top; j++ )

if ( fit(state[j], cur[i-1]) )

for ( int k = 1; k <= top; k++ )

if ( fit(state[k], cur[i]) && fit(state[k], state[j]) )

dp[i][k] = (dp[i][k] + dp[i-1][j]) % mod;//狀態轉移加上上一行的所有可行方案

for ( int j = 1; j <= top; j++ )

ans = (ans + dp[n][j]) % mod;//答案都在最後一行

printf( "%d\n", ans );

return

0;}

最後附上我對你的思念。

POJ 3254 Corn Fields 狀態壓縮

具體見注釋 include include include include include include include include include include include include using namespace std define mod 100000000 int n,m...

poj3254Corn Fields 狀態壓縮dp

理解都在 注釋裡 題目直通車 include 狀態壓縮 includeconst int maxn count 377 10 count的值是377 const int mod 1e8 int n,m int count int dp 15 maxn count dp 最終答案存在 dp n i i...

POJ 3279(狀壓暴力)

poj 3279 不會做。但是感覺思路挺有意思的 大體的思路是 把第一行狀態確定好了,之後的每一行都由前一行決定,也就是之後的所有狀態都確定好了,此時列舉第一行的狀態,看看根據該情況最後一行是否能符合情況,難點就是狀態的壓縮,也是比較基礎的地方了,主要還是難想,對就是菜。include includ...