狀壓DP NOIP2017 寶藏

2021-08-28 03:32:00 字數 1415 閱讀 8712

很簡單的狀壓dp水題。。。一年前我居然不會。。。太菜了。。。dp

[i][

j]d p[

i][j

]表示前i層,被選中的狀態為

j j

的最小代價。

每次列舉乙個集合

k' role="presentation" style="position: relative;">k

k,把k中每個點向

j j

中最短的邊取和。再乘上(i

+1)' role="presentation" style="position: relative;">(i+

1)(i

+1)

這裡並不需要區分哪些是上一層的,因為優越性已經可以保證方案的正確性了。

#include

#include

#include

#include

#define sf scanf

#define pf printf

#define maxn 20

#define maxm 4100

using

namespace

std;

typedef

long

long ll;

ll dist[maxn][maxn];

ll len[maxm][maxm];

int bits[maxm];

ll dp[maxn][maxm];

ll min1(ll x,ll y)

int main()

for(int i=0,j=1;i1)

bits[j]=i;

for(int i=1;i<(1

<1)^i;

for(int j=pre;j;j=(j-1)&pre)

if(mindist!=-1&&len[i^(1

<1)

len[i][j]=len[i^(1

len[i][j]=-1;}}

memset(dp,-1,sizeof dp);

for(int i=0;i0][1

<0;

ll ans=-1;

for(int i=0;ifor(int j=0;j<(1

ans))

continue;

int x=((1

<1)^j;

for(int k=x;k!=0;k=(k-1)&x)

if(len[k][j]!=-1)

dp[i+1][k|j]=min1(dp[i+1][k|j],dp[i][j]+(i+1)*len[k][j]);

if(j==(1

<1)

ans=min1(ans,dp[i][j]);

}pf("%lld",ans);

}

NOIP2017 寶藏 題解(狀壓DP)

參與考古挖掘的小明得到了乙份藏寶圖,藏寶圖上標出了 nnn 個深埋在地下的寶藏屋,也給出了這 nnn 個寶藏屋之間可供開發的m mm 條道路和它們的長度。小明決心親自前往挖掘所有寶藏屋中的寶藏。但是,每個寶藏屋距離地面都很遠,也就是說,從地面打通一條到某個寶藏屋的道路是很困難的,而開發寶藏屋之間的道...

最短路 拓撲排序 dp NOIP 2017 逛公園

讓我們一起來 forever shi神犇 題意 給你乙個n nn個點m mm條邊的有向帶權圖,設1 11號點到n nn號點的最短路是dis disdi s,給你乙個k k 50 k k 50 k k 5 0 求所有1 11到n nn的路徑中長度不超過dis k dis k dis k的數量。題解 顯...

班服 狀壓DP NOIP模擬賽

沒有題面。看到這個坑爹的資料量 最多10個班級 大概會對狀壓有一些想法 反正我是沒想到 本題暴搜可得50分 從資料量可以看出 狀態壓縮壓縮的是已選擇的班級而不可能是班服種類。dp i j 表示 前i種班服到達狀態j的方案數。首先,如果不選第i種班服,那麼dp i j dp i 1 j 如果要選第i種...