憤怒的小鳥
這道題目不是一道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 障礙物...