憤怒的小鳥

2021-09-29 17:07:24 字數 1551 閱讀 9414

憤怒的小鳥

這道題目不是一道sb的狀壓嗎。

我們設f[i

]f[i]

f[i]

,表示射擊狀態是i

ii,最少用了多少直線。

i

ii的第j

jj位為1

11表示射擊這個位置。

然後對於每個直線跑揹包。

時間複雜度:o(t

n22n

)o(tn^22^n)

o(tn22

n)但是其實有更快做法,限制i

ii只能被包含最低位的1

11的直線所更新,那麼就是n

nn條直線,所以就是o(t

n2n)

o(tn2^n)

o(tn2n

) 話說我為什麼要打莫比烏斯反演

#include

#include

#include

#include

#include

#define n 20

#define nn 300000

using

namespace std;

template

<

class

t>

inline t mymax

(t x,t y)

template

<

class

t>

inline t mymin

(t x,t y)

double f[10]

[10];

bool

gsxy()

if(mmax<=

1e-6

)return0;

if(id!=i)

swap

(f[id]

,f[i]);

for(

int j=i+

1;j<=n;j++)}

for(

int i=n;i>=

1;i--

)return1;

}//高斯消元

//那麼解析式就是f[0][1]x^2+f[0][2]x+f[0][3]

struct node

a[n]

;int dp[nn]

,ff[nn]

;//dp[x]表示的是覆蓋x的最少直線數目

int n,m;

intmain()

for(

int o=x;o;o=

(o-1

)&x)dp[o]=1

;int k=limit^x;

for(

int o=k;o;o=

(o-1

)&k)

dp[o^x]

=mymin

(dp[o^x]

,dp[o]

+dp[x]);

}}}}

}printf

("%d\n"

,dp[limit]);

}return0;

}

憤怒的小鳥

對於每兩隻豬,只要他們的橫座標不一樣,就會有一條經過原點的二次函式y ax2 bx同時經過這兩隻豬,那麼這時就是解二元一次方程的時候了,設第一只豬的座標為 x1,y1 第二隻豬的座標為 x2,y2 y1 ax1 2 bx 1 y2 ax2 2 bx 2 化為 b y 1 ax 12x1 y2 ax2...

憤怒的小鳥

qaq 狀壓dp 1表示小鳥打掉了,0表示沒打掉。dp s 表示到s狀態最少需要幾步。怎麼列舉a,b。因為c 0,只需兩隻豬即可確定一條曲線。boom i j 表示i豬和j豬確定的曲線可以打掉的豬。關於轉移 列舉狀態s中第一只沒有打掉的小豬,固定i,列舉j即可 注意初始化 include inclu...

憤怒的小鳥

include include include include pragma comment lib,winmm.lib 函式外部全域性變數定義 int high,width 遊戲的邊界 int bird x,bird y 小鳥的位置 int bar y,bar xdown,bar xtop 障礙物...