我發現現在沒了題解我做普及提高+的題也做不了 更不要說這些提高+難度的題
此題是乙個二維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...