洛谷 P1941 飛揚的小鳥 (題解)

2022-09-18 12:33:12 字數 1276 閱讀 2515

這題關於dp

用f[i][j]表示橫座標為i時高度為j的最少點選次數。

用正無窮來表示不可能達到這個狀態。

於是我們可以分析出狀態轉移的方式:

上公升——完全揹包轉移方式

下降——01揹包轉移方式

超過m變為m——特判

細節詳見**

#include

#include

#include

using

namespace std;

int maxx=

100000

;int l[

10010

],h[

10010];

int f[

10010][

1010];

int x[

10010

],y[

10010];

bool p[

10010];

intmain()

l[n]=0

; h[n]

=m+1

;for

(i=0

;i)for

(i=1

;i<=n;i++)}

f[0]

[0]=maxx;

for(i=

1;i<=m;i++

)for

(i=1

;i<=n;i++)}

f[i]

[j]=

min(f[i]

[j],f[i-1]

[j-x[i-1]

]+1)

; f[i]

[j]=

min(f[i]

[j],f[i]

[j-x[i-1]

]+1)

;}for(j=

max(

1,l[i]+1

);j<=

min(m-y[i-1]

,h[i]-1

);j++

)for

(j=l[i]

;j>=

1;j--

)for

(j=h[i]

;j<=m;j++)}

int ans=maxx;

int cnt=k;

for(i=n;i>=

1;i--)if

(ansif(p[i]

==true)}

if(cnt==k)

else

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 飛揚的小鳥

動態規劃,設 f i j 表示小鳥到達座標 i j 所要點選螢幕的最少次數,如果小鳥無法到達 i j 則 f i j inf。轉移,考慮小鳥上公升,和下降兩種狀態。因為,在乙個點上公升次數不限,下降只有一次。所以上公升可以用 完全揹包 的狀態轉移,下降用 01揹包 轉移。特判,當小鳥到達頂上 m 時...