洛谷P2831 憤怒的小鳥

2022-03-17 14:51:30 字數 749 閱讀 8332

題目

狀壓dp。

直接列舉二進位制數表示當前豬有沒有被消滅的狀態。

最終答案的幾條拋物線必定至少撞到乙個豬。而且兩頭豬確定一條拋物線,可以列舉兩頭豬,分別求出他們的拋物線所消滅豬的狀態,然後可以用類似揹包的方法轉移dp。

有方程:

\(dp[i|(\)當前拋物線的狀態\()] = min(dp[i|(\)當前拋物線的狀態\()],dp[i]+1)\)

有轉移:

列舉每個狀態,每個狀態再列舉每個可以撞到的一頭豬,再用該豬列舉是否存在既能撞到該豬,又能撞到另一頭豬的拋物線,然後即可確定拋物線,也可確定拋物線的狀態了。根據拋物線的狀態,即可實現轉移

#include #define n 1001001

using namespace std;

int t, n, m;

double x[1001], y[1001];

int vis[1001000], dp[1010011], ha[1001][1001];

double f(double a, double b, double x)

inline void add(int i, int j)//確定好所有拋物線的狀態 }

inline void clear()

int main()

printf("%d\n", dp[(1 << n)- 1]);//所有數都選上的最小代價。

} return 0;

}

洛谷 P2831 憤怒的小鳥

kiana最近沉迷於一款神奇的遊戲無法自拔。簡單來說,這款遊戲是在乙個平面上進行的。有一架彈弓位於 0,0 處,每次kiana可以用它向第一象限發射乙隻紅色的小鳥,小鳥們的飛行軌跡均為形如 當小鳥落回地面 即x軸 時,它就會瞬間消失。在遊戲的某個關卡裡,平面的第一象限中有n只綠色的小豬,其中第i只小...

洛谷p2831憤怒的小鳥

原題 每個豬的位置不同,所以不能簡單的表示出狀態,all i 表示第i個拋物線打掉了哪些豬,其值本身儲存狀態 二進位制 只需要找所有有用的拋物線,然後狀壓f i 表示i狀態下最少用掉的鳥,轉移方程見 其中的m可以用來優化。雖然長,但是比較好懂。include include include incl...

洛谷 P2831 憤怒的小鳥

狀壓dp text dpn 18 n leq 18 n 18 不是暴搜就是狀壓,因為我jio jioji o得狀壓會比較好理解,所以就寫一篇狀壓的題解叭 首先我們要預處理出經過任意兩點的拋物線可以擊中的小豬有哪些,可以用lin e i j line i j line i j 來表示經過i,j i,j...