P1941 飛揚的小鳥

2022-04-29 03:03:10 字數 1580 閱讀 3181

動態規劃,設 f [ i ][ j ] 表示小鳥到達座標( i , j ) 所要點選螢幕的最少次數,如果小鳥無法到達( i , j ),則 f [ i ][ j ] = inf。

轉移,考慮小鳥上公升,和下降兩種狀態。

因為,在乙個點上公升次數不限,下降只有一次。

所以上公升可以用 完全揹包 的狀態轉移,下降用 01揹包 轉移。

特判,當小鳥到達頂上 m 時,如果繼續點選螢幕,小鳥不會上公升、死亡,也不會掉下來,但是螢幕點選次數要 +1 。

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define lck_max(a,b) ((a)>(b)?(a):(b))

#define lck_min(a,b) ((a)<(b)?(a):(b))typedef

long

long

ll;const

int maxn=10005

;const

int inf=1e9+7

;ll n,m,k,i,j,ans=inf;

ll f[maxn][

4005

];struct

hht[maxn];

struct

hhhg[maxn];

inline ll read()

while

(isdigit(ls))

return xs*kr;

}inline

void

out(ll xs)

if(xs<0) putchar('

-'),xs=-xs;

int kr[57],ls=0

;

while(xs) kr[++ls]=xs%10,xs/=10

;

while(ls) putchar(kr[ls]+48),ls--;

}int

main()

for(i=1;i<=n;i++)

for(j=0;j<=m;j++)

f[i][j]=inf;

for(i=1;i<=n;i++)

for(i=1;i<=m;i++)

ans=lck_min(ans,f[n][i]);

if(ansout(1),putchar('

\n'),out(ans),putchar('

\n');return0;}

for(i=n;i>=1;i--)

for(j=1;j<=i;j++)//

記錄小鳥最多能過多少柱子

if(g[j].p) ans++;

out(0),putchar('

\n'),out(ans-inf),putchar('\n'

);return0;

}

P1941 飛揚的小鳥

定義dp i j 表示走到座標 i,j 時的最小點按次數。考慮遞推關係,能走到座標 i,j 一種情況是從前乙個位置下降上公升的轉移是乙個完全揹包,下降是01揹包。include using namespace std define ll long long define inf 0x3f3f3f d...

P1941 飛揚的小鳥

miku 定義 f 為到達 i,j 的最小代價 然後對於從下往上,因為可以點無數次,是個完全揹包,從上往下就一次,01揹包,飛到天花板上的,拽下來 水管特判 include include includeusing namespace std const int maxn 10005 int n,m...

P1941 飛揚的小鳥

為了簡化問題,我們對遊戲規則進行了簡化和改編 遊戲介面是乙個長為n 高為 m 的二維平面,其中有k 個管道 忽略管道的寬度 小鳥始終在遊戲介面內移動。小鳥從遊戲介面最左邊任意整數高度位置出發,到達遊戲介面最右邊時,遊戲完成。小鳥每個單位時間沿橫座標方向右移的距離為1 豎直移動的距離由玩家控制。如果點...