洛谷 狀壓DP P2831 憤怒的小鳥

2021-09-29 12:40:25 字數 1456 閱讀 7535

◇題目傳送門◆

看到n

nn這麼小,我們很容易想到狀壓或者是爆搜。。。

設l (i

,j

)l(i,j)

l(i,j)

為經過豬i

ii和豬j

jj的拋物線能夠擊中的豬的集合。

設f (s

)f(s)

f(s)

為擊中s

ss中的豬所需的最少的鳥的數量。則有以下兩種轉移:

但這樣的複雜度是o(t

n22n

)o(tn^22^n)

o(tn22

n)的,這樣做是過不了的,所以必須考慮優化。

考慮第一只不屬於集合s

ss中的豬i

ii,我們強制必須首先擊中這只豬,然後轉移。

因為若我們不擊中這只豬,後面就必須再倒回來射這只豬,也就是後面沒射的豬的轉移都是多餘的。所以這樣轉移就可以節省時間。

這樣加上乙個小的優化,複雜度就能夠減少到o(t

n2n)

o(tn2^n)

o(tn2n

)了,就能夠通過這道題。

#include

#include

#include

#include

using

namespace std;

const

int maxn =18;

const

int inf =

0x3f3f3f3f

;const

double eps =

1e-6

;int n;

double x[maxn +5]

, y[maxn +5]

;int line[maxn +5]

[maxn +5]

;int f[(1

<< maxn)+5

];inline

void

solve

(double

&x,double

&y,double a1,

double b1,

double c1,

double a2,

double b2,

double c2)

intmain()

f[0]

=0;for

(int s =

0; s <(1

<< n)

; s++

)for

(int i =

1; i <= n; i++)if

(!(s &(1

<<

(i -1)

)))break;}

printf

("%d\n"

, f[(1

<< n)-1

]);}

return0;

}

洛谷P2831 憤怒的小鳥 狀壓dp

題目鏈結 這題。我樣例沒過就a了?算了,就當是樣例卡精度吧。直接狀壓dp一下,f sta 表示乾掉 sta 這個集合裡面的鳥的最小運算元 轉移的時候判斷一下一次能乾掉多少鳥。include define ll long long using namespace std const int maxn ...

洛谷 P2831 憤怒的小鳥 狀壓DP

一.浮點數判相等 二.拋物線的判斷 題目中的拋物線有兩個未知數,在正常情況下,每兩點便可確定一條拋物線,但以下情況除外 1.兩點所在的直線經過原點 2.兩點橫座標相等 3.a 0 注 本題可用隨機化。include include include int para 650 int tot defin...

洛谷P2831 憤怒的小鳥 貪心?狀壓DP

題目 一開始想 n 3 貪心來著 先按 x 排個序,那麼第乙個不就一定要打了麼?在列舉後面某乙個,和它形成一條拋物線,選能順便打掉最多的那個 然後連樣例都過不了.include include include include include define eps 1e 9 using namespa...