很簡單的狀壓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種...