poj解題報告 3254

2021-07-03 18:29:17 字數 968 閱讀 5989

狀態壓縮dp。

題意:給出乙個n行m列的草地,1表示肥沃,0表示貧瘠,現在要把一些牛放在肥沃的草地上,但是要求所有牛不能相鄰,問有多少種放法。

分析:假如知道第 i-1 行的所有的可以放的情況,那麼對於第 i 行的可以放的一種情況,只要判斷它和 i - 1 行的所有情況的能不能滿足題目的所有牛不相鄰,如果有種中滿足,   那麼對於 i 行的這一中情況有 x 中放法。

前面分析可知滿足子狀態,我們我們確定可以用dp來解決。

但是又發現,狀態是一種放法,不是我們平常dp的簡單的狀態,所以要用狀態壓縮!

什麼是狀態壓縮呢

比如前面的情況,一種放法是最多由12個 0 或者 1 組成的,那麼很容易想到用二進位制,用二進位制的乙個數來表示一種放法。

定義狀態dp[i][j],第 i 行狀態為 j 的時候放牛的種數。j 的話轉化成二進位制,從低位到高位依次 1 表示放牛0表示沒有放牛,就可以表示一行所有的情況。

那麼轉移方程 dp[i][j]=sum(dp[i-1][k])

狀態壓縮dp關鍵是處理好位運算。

這個題目用到了 & 這個運算子。

用 x & (x<<1)來判斷乙個數相鄰兩位是不是同時為1,假如同時為 1 則返回乙個值,否則返回 0 ,這樣就能優化掉一些狀態

用 x & y 的布林值來判斷相同為是不是同時為1。

#include#include#include#define mod 100000000

int n,m,a[15];

int dp[13][(1<<12)+10];

int check(int x,int flag)

void solve()}}

for(i=0;i=mod)

res=res%mod;

}printf("%d\n",res);

}int main()

}solve();

}return 0;

}

poj解題報告 1328

不得不說,這題是讓我飽受折磨,畢竟第一次做貪心演算法,而且wa了好多次,幸好有學長的幫助,最終找到了問題所在,是在快排上是問題,double高位不可向int低位轉換,由於一開始強制轉換導致雖然樣例和其他的測試資料過了,但還是wa,現在改完了就對了,附上ac ps 這題通過率是22 真心不簡單 如下 ...

poj解題報告 2586

這題我是用的貪心演算法,其實不用也可以,列舉也能解決,因為情況不多。因為是每連續5個月必有虧損,而一年只有1 5,2 6,3 7,4 8 8 12共8種情況。現在設盈餘為s,虧損為d,可列出以下幾種情況。ssssdssssdss 4ssssddsssddss 3s 2d ssdddssdddss 2...

poj解題報告 2635

這題特別好理解,就是 坑啊。題意就是給乙個數,這個數是兩個大素數的積,再給出乙個數,如果最小的素數比給的數大,列印good,否則列印bad和最小的素數。這題用的方法是高精度求模 同餘模定理。還有素數打表,把10 6內的素數全部預打表,在求模時則列舉到小於l為止。注意打表不能只打到100w,要保證素數...