設 \(f[s]\) 表示選了集合 \(s\) 裡的作業做完,最小的代價。
由於最終方案要求字典序最小,所以我們要從後往前 dp,有轉移
\[f[s]=\min_(f[s\cup i]+\max(t[s\cup i]-d[i],0))
\]其中 \(t[s]\) 表示完成集合 \(s\) 裡的作業需要的時間。
然後記錄前驅輸出即可。
時間複雜度 \(o(t(2^n+2^n))\)。
#include using namespace std;
const int n=55,m=(1<<20);
int q,n,f[m],d[n],c[n],a[m],lg[m],pre[m];
char ch[n][n];
int main()
printf("%d\n",f[0]);
for (int s=0;s!=(1<
printf("%s\n",ch[lg[pre[s]]]);
} return 0;
}
雷達裝置 Ybtoj
有n nn個建築物,第i ii個建築物在笛卡爾座標系上的座標為 xi yi x i,y i xi y i 你需要在x xx軸上安裝一些雷達,每個雷達的偵察半徑均為d dd,要求每個建築物都至少被乙個雷達偵測到,求最少要安裝幾個雷達。第一行兩個正整數n,d n,dn,d。接下來n nn行,第i ii行...
YBTOJ 電路維修
思路 乍一看這題,沒有bfs的頭緒 但是,我們想到了spfa 我們可以把地圖中的每個點看成方格,這樣就有 n 1 m 1 個方格 如果兩點之間有線聯通,那它們之間的邊權就是0,否則就為1 然後spfa就可以了 include include include using namespace std i...
YBTOJ 守衛挑戰
有 n 項任務,有乙個數 k 每一項任務成功的概率是 p i 這裡與原題目不同,原題目是百分之 p i 這裡相當於 p i frac 成功後會使 k 加上 a i 問至少成功 l 次且最後 k leq0 的概率是多少。資料範圍 0 leq k leq2000,0 leq l leq n leq 20...