動態規劃,設 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 豎直移動的距離由玩家控制。如果點...