狀壓DP題目整理

2021-10-09 05:13:11 字數 1777 閱讀 6027

傳送門

#include .h>

using namespace std;

using ll = long long;

#define maxn 22

ll dp[

1<;int x[

150]

;ll k[

150]

;int m[

150]

;int d[

150]

;int id[

150]

;ll n,m,b;

intmain()

id[i]

=i;}

sort

(id+

1,id+

1+n,[=

](int x,

int y)

->

bool);

for(

int i=

0;i) dp[i]

=2e18

;//cout=0

; ll ans=dp[1]

; ll inf=ans;

for(

int t=

1;t<=n;t++

) ans=

min(ans,dp[lim-1]

+1ll*b*k[i]);

}if(ans==inf)ans=-1

; cout<}

題意:給你n個物品(n<=24),每個物品有乙個體積v

iv_i

vi​,乙個箱子最多能容納v體積,問最少需要幾個箱子?

#include .h>

using namespace std;

using ll = long long;

#define maxn 24

int d[

1<;int p[

1<;int a[

1<;int s[maxn+3]

;int

lowbit

(int x)

intmain()

int lim=

1

=1;for

(int i=

1;i) s[i]

=s[i-1]

<<1;

for(

int i=

0;i) d[0]

=0; p[0]

=k;for

(int j=

1;j)else

mod += a[cur];if

(cnt < d[j]

|| cnt == d[j]

&& mod < p[j]

) tmp-=cur;}}

cout<-1

<}

卡常數有點毒瘤,首先我用了乙個陣列表示乙個狀態的最小需要體積。

那麼用到的箱子數量就是dp[i]/k+(dp[i]%k>0),但是由於用到了除法常數有點大。

所以我比賽時候被卡了。

正解應該是開兩個陣列。。。。

乙個記錄狀態的箱子數量,乙個記錄狀態的當前使用箱子已用體積。

這樣就可以避免除法了。

然後,這裡有乙個很妙的點在於:

其實這個2^nn得遞推,做到了類似於全排列n!的效果。

即囊括了所有可能的先後順序。

然後這題還卡常數,實測lowbit快於每一位的列舉,這樣才100%通過*

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

狀壓dp學習

p2704 炮兵陣地 1038 裁玻璃 狀壓dp是一種非常暴力的做法,列舉所有可能的狀態,找到要求的最佳狀態,與一般dp不同,前一項與後一項有一些複雜的狀態關係。dp的引數 物品個數 行數等 當前狀態 上乙個狀態 將abc的有無表示成乙個8個狀態,列舉所有組,列舉上乙個狀態,得到當前狀態的最優解 i...