NOIP2014 飛揚的小鳥

2022-05-07 10:21:09 字數 1789 閱讀 5044

題目戳這裡

70分是很裸的。

定義f[i][j]表示到了(i,j)位置最少戳的次數

有三種轉移

●f[i][j]=min--------------------------dp1

從(i,j-k*x)連戳k次跳到(i,

j)●f[i][j]=min(f[i][j],f[i-1][j+y[i-1]])-------------------------dp2

從(i,j+y)不戳掉到(i,j)

●if(j==m)

f[i][j]=min(f[i][j],f[i-1][t]+(j-t)/x[i-1]+1) -----dp3 

t為 i-1處的任意合法位置

j在頂端,所以只要(i-1,t)合法

可能從任意 t 跳到(i,j),因為碰到上界無法跳且不死

複雜度o(nm^2) 乙個穩穩的t

100分有乙個小優化

這樣思考:此題是可以過o(nm)的,而f[i][j]是必須要的,i和j必須列舉,那麼我們k的列舉就必須被乾掉。   

假設1,2,3,4,5,6,7,8號點和(i,j)點均合法

可見,對於上圖

(i,j)點要由1,2,3,4號點轉移過來

而5號點由2,3,4號點轉移過來------->(i,j)可由5號點和1號點轉移

6號點由3,4號點轉移過來------->5號點可由6號點和2號點轉移

7號點由4號點轉移過來------->6號點可由7號點和3號點轉移

f[i][j]可由f[i-1][j-x[i-1]]和f[i][j-x[i-1]]轉移

道理很顯然

f[i-1][j-k*x[i-1]]+k(k>=2)的資訊全部存到了f[i][j-x[i-1]]中,k只用列舉1就行了

由於其他轉移均為o(1),所以不用優化

複雜度o(nm)  

另外,若不能到達n,要求出能通過幾根管子

這個其實很簡單,只某一橫座標上所有合法點值均為inf,那麼肯定不能到達此位置

記錄個最遠到達的橫座標,判斷此橫座標前有幾根管子就行了

寫**時有幾點要注意

●先把所有向上跳的轉移後再來轉移向下降的

為什麼?    因為我們畢竟不是(i,j-x[i-1])點跳上來的

如果(i,j-x[i-1])點最優轉移是向下降,且(i,j)點最優轉移是f[i][j-x[i-1]]

那麼我們的f[i][j]=f[i][j-x[i-1]]是什麼意思?先向下落了一點又跳上來?

這不符合遊戲規則,所以要分開寫。

●不只轉移合法點,非法點(管子)也必須轉移,因為它會存有(i-1,j-k*x[i-1])k>=2的資訊

●判斷**點是否合法

至此,此題已解決

**:

#include#include#include#include#define ll long long

#define n 1005

using namespace std;

int up[n*10],dn[n*10],x[n*10],y[n*10],f[n*10][n],n,m,k,ans2,ans1=0x3f3f3f3f;

int main(){

scanf("%d%d%d",&n,&m,&k);

for(int i=0;i0)f[i][j]=f[i][j-x[i-1]]+1;

if(j-x[i-1]>dn[i-1]&&j-x[i-1]dn[i-1]&&tdn[i-1]&&j+y[i-1]

NOIP2014 飛揚的小鳥

題目 分析 乙個揹包問題。i,j 是跳上來的情況時 可以由 i,j k 得到,則問題得到解決。注意 f陣列要先進行上公升操作,再進行下降操作,否則 i,j k 有可能是下降得到的,從而得到錯解 吸取我的教訓吧,調了好長時間 include include using namespace std co...

NOIP2014飛揚的小鳥

天哪細節問題調了乙個鐘,手速不夠快思路不夠清晰寫了乙個鐘,感覺一道第三題就要花掉我2個鐘那我比賽的時候腫麼辦qaq 說下這道題,首先純暴力,70分到手,然後我們把01揹包的轉移變成有上界的完全揹包,還有一些特殊情況特殊轉移,還是比較好看的,去年比賽不知是電腦問題還是什麼一直沒輸出,蠢到家了然後這題爆...

NOIP2014 飛揚的小鳥

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