Luogu P1941飛揚的小鳥(DP)

2022-05-01 02:06:12 字數 1631 閱讀 4462

我發現現在沒了題解我做普及提高+的題也做不了  更不要說這些提高+難度的‍題

此題是乙個二維dp。暴力是三重迴圈ijk,k列舉在i位置上的點選次數。即

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

for(int j=1;j<=m;++j)

for(int k=1;j-k*up[i]>0;k++)    f[i][j]=min(f[i][j],f[i][k]+k);

這樣的暴力能拿到80分。但是很不幸,我一開始搞錯了,所以只拿了60,剩下20是tle。

後來發現可以把水管放在外面計算。也就是三重暴力算完之後,把水管部分的值修改為inf,讓它被覆蓋掉。

然後有乙個想法就是f[i][j]=f[i][j-up[i]]。也就是說現在這個狀態(比如點a次)可以從點a-1次的狀態轉移過來。

於是100分,但是1829ms被zht大佬完虐(137)

#include#include

#include

#include

inline

long

long min(long

long a,long

long b)

long

long

inf;

inline

long

long

read()

while

(isdigit(ch))

return num*f;

}struct

point

}map[

10010],pipe[10010

];long

long f[10010][1010

];long

long

ans;

long

long

tot;

intmain()

for(long

long i=1;i<=k;++i)

memset(f,

127/3,sizeof

(f));

ans=inf=f[0][0

];

for(long

long i=0;i<=m;++i) f[0][i]=0

;

for(long

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

if(j==m)

for(long

long k=j-map[i-1].up;k<=m;++k)

}for(long

long j=1;j<=m;++j)

if(f[i][j]>f[i-1][j+map[i-1].down]&&j+map[i-1].down<=m)

f[i][j]=f[i-1][j+map[i-1

].down];

long

long minn=inf;

for(long

long k=1;k<=m;++k)

if(minn==inf)

if(pipe[i].up<=m) tot++;

}for(long

long i=1;i<=m;++i)

printf(

"1\n%lld

",ans);

return0;

}

luogu P1941 飛揚的小鳥

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

題解 luogu P1941 飛揚的小鳥

首先想到設f i j 表示到第i行第j列所需要的最少點選螢幕次數。轉移方程為 f i j min 1 k j x 上公升 f i j min j y i 1 m 下降 顯然,下降可以o 1 轉移,主要問題在上公升的轉移。我們將上公升的方程變一下 f i j x i 1 min 這是 f i j x ...

P1941 飛揚的小鳥

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