LibreOJ 6177 題解(狀壓DP)

2022-03-29 10:22:37 字數 870 閱讀 3079

傳送門

剛看到這道題時想的是跟最短哈密頓路類似的二進位制狀壓dp,先用floyd處理距離

但是此題用二進位制不夠,應該用三進製

0,1,2分別表示未送,正在送,已送完

dp[s][i]表示當前送到任務狀態為s,現在在點i

狀態轉移方程見**

時間複雜度\(o(n^3+3^qqn\)

#include#include#include#include#define maxs 60000

#define maxn 22

#define inf 0x3f3f3f3f

using namespace std;

int n,m,q;

int pow3[maxs];

int dp[maxs][maxn];

int dist[maxn][maxn];

int s[maxn];

int t[maxn];

int l[maxn];

int r[maxn];

void floyd()

} }}int main()

for(int i=1;i<=n;i++) dist[i][i]=0;

floyd();

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

pow3[0]=1;

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

memset(dp,0x3f,sizeof(dp));

dp[0][1]=0;

int ans=0,cnt=0;

for(int i=0;i}

ans=max(ans,cnt);

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

}

狀壓dp題解

實現 includeconst int maxn 1 20 1 typedef long long ll ll f maxn a 25 a x 記錄第x行的障礙狀態 int lowbit int x int main f 0 1 乙個也不放也是一種方案 int maxs 1 判斷當前狀態下狀態的1的...

題解 星空 狀壓DP

這道題思維難度非常高,有很多處理的小技巧,並且 也有很多細節 這道題是一種序列的區間操作,我們都知道,區間操作比較麻煩,所以我們要想辦法將區間操作轉換成單點修改 這時,我們想到了差分,假如我們對乙個序列進行操作,這時乙個序列裡的相對狀態不會變只有兩端改變,換句話說就是這個序列的差分並不會發生改變,只...

題解 Vjestica (狀壓DP)

有n個字元合集,求其字首樹的最少結點個數。資料範圍 n 16,1 m 1000000 字元個數 首先看到 n 16 可知,這道題是狀壓dp或者暴力 狀態是什麼?因為是n的資料範圍小,n為字元合集個數,所以狀態是 n個字元合集的整體 的選擇情況,這裡用s表示,二進位制範圍為 1 11111111111...