p2831 憤怒的小鳥
我們注意到\(n≤18\)所以考慮狀壓$dp或者暴力。
定義\(f[s]\)表示\(s\)為\(1\)位置上的豬已經被打掉的最少次數
顯然我們能很容易的得到轉移方程
\(dp[0]=0\)
\(dp[s|line[i][j]]=min(dp[s]+1)\)
\(dp[s|(1<<(i-1)]=min(dp[s]+1)\)
考慮如何優化
因為我們先打\(1,4\)再打\(2,3\)的代價和先打\(2,3\)再打\(1,4\)的代價是一樣的。
所以我們找乙個\(x\)使得\(s&(1<,使得轉移到\(s\)這個狀態必須要先打\(x\)這個點,就是把最低的\(0\)位置變成\(1\),因為經過\(x\)的線的條數是\(o(n)\)所以總的時間複雜度是\(o(n\ast 2^n)\)
這種優化方法對於取的順序不影響答案是可以學習的
#includeusing namespace std;
const double eps=1e-8;
int t,n,m,bit[(1<<20)+5],line[20][20],f[(1<<20)+5];
double x[20],y[20];
inline int read()
while(ch<='9'&&ch>='0')ret=ret*10+ch-'0',ch=getchar();
return ret*f;
}void equation(double &x,double &y,double a1,double b1,double c1,double a2,double b2,double c2)
void make_bit()
for(int i=0;i<(1
}
題解 P2831 憤怒的小鳥
題目鏈結 題目大意 第一象限內有 n 個點 n leq 18 求最少要多少條形如 y ax 2 bx quad a 0,a,b,in r 的拋物線才能覆蓋所有點 狀壓 dp 分析 n 的資料範圍很小,因此我們可以考慮狀壓 dp 填表法不好做我們可以用刷表法 用 f s 表示覆蓋集合 s 內點的最小代...
P2831 憤怒的小鳥
kiana最近沉迷於一款神奇的遊戲無法自拔。簡單來說,這款遊戲是在乙個平面上進行的。有一架彈弓位於 0,0 處,每次kiana可以用它向第一象限發射乙隻紅色的小鳥,小鳥們的飛行軌跡均為形如y ax 2 bxy ax2 bx的曲線,其中a,b是kiana指定的引數,且必須滿足a 0。當小鳥落回地面 即...
P2831 憤怒的小鳥
傳送門 看到資料範圍就知道是搜尋或狀壓dp 算了一波複雜度搜尋好像過不了極限資料 搞狀壓設 f i 表示所有豬的狀態為 i 二進位制下1表示死了,0表示沒死 時需要的最少發射次數 設 p i j 存經過第 i 只豬和第 j 只豬的拋物線經過的豬的狀態 可以 n 2 預處理出來,解方程都會吧.找到第乙...