USACO 狀壓DP練習 3

2022-04-06 20:18:03 字數 2003 閱讀 3081

1725

題意:$m*n:\ m,n \le 12$的牧場,有的格仔不能選,相鄰不能同時選,求方案數

$f[i][j]$前$i$行當前行選的集合為$j$

#include #include 

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;const

int n=13,s=(1

<<12)+5,p=1e8;

inline

intread()

while(c>='

0'&&c<='9')

return x*f;

}int

m,n;

intf[n][s],cant[n];

inline

void mod(int &x)

intmain()

view code

1231

題意:$n \le  16$個數字排列,所有相鄰數字相差$\ge k$的方案數

$f[i][j]$表示當前已經選上的數字集合為$j$,以第$i$個數字結尾的方案數

#include #include 

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;const

int n=18,s=(1

<<16)+5,p=1e8;

inline

intread()

while(c>='

0'&&c<='9')

return x*f;}

intn,k,a[n];

ll f[n][s];

intmain()

ll ans=0

;

for(int i=0;i1

]; printf(

"%lld

",ans);

}

view code

1688

題意:有n頭牛,它們可能患有d種病,現在從這些牛中選出若干頭來,但選出來的牛患病的集合中不過超過k種病,最多選幾頭

$f[i][s]$表示前$i$頭病集合為$j$最多選幾頭

用更新的寫法比較好,因為你不知道去掉第$i$頭後其他牛有沒有第$i$頭牛的病,還得預處理之類的

#include #include 

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;const

int n=1005,s=(1

<<15)+5

;inline

intread()

while(c>='

0'&&c<='9')

return x*f;

}int

n,m,k,a[n],f[s];

inline

int bitcount(int

n)int

main()

int all=1

<

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

for(int j=all-1;j>=0;j--)

f[j|a[i]]=max(f[j|a[i]],f[j]+1

);

int ans=0

;

for(int j=0;j)

if(bitcount(j)<=k) ans=max(ans,f[j]);

printf("%d

",ans);

}

狀壓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練習

有乙個n m n 5,m 1000 的棋盤,現在有1 2及2 1的小木塊無數個,要蓋滿整個棋盤,有多少種方式?答案只需要mod1,000,000,007即可。我也不知道這道題的 qaq n和m的範圍本應是相同的,但是題目給出的n的值很小,這就給我們提供了使用狀壓dp的思路。假設第一列已經鋪滿,則第二...

狀壓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表示本行...