BZOJ1499 NOI2005 瑰麗華爾茲

2022-05-19 20:48:08 字數 1210 閱讀 9626

有乙個字元矩陣,'.'表示能走,'x'表示不能走,給出起點的座標,起點有一座鋼琴,每單位時間可以移動一格,共有k個時間段,然後再給出每個時間段起始時間和結束時間,以及當前時間段能夠移動的方向。而在某個時間,可以控制鋼琴不動,鋼琴不能走到'x'而且不能走出矩陣

求出鋼琴最多能走多少格

一眼dp題

設f[t][i][j]表示第t時間走到(i,j)最多能走的格數,f[t][i][j]=max(f[t-1][i][j],f[t-1][i-dx[i]][j-dy[i]]+1),時間複雜度o(nmt),超時

我們重新搞dp方程,設f[k][i][j]表示第k時間段走到(i,j)最多能走的格數,f[k][i][j]=max(f[k][i][j],f[k-1][i-dx[i]*c][j-dy[i]*c]+c),c為第k-1時間段走多長時間

因為每個時間段都是對於一行或者一列進行操作的,所以我們可以分成四種情況來單調佇列

這樣子時間複雜度就是o(nmk)

還要提的一點是,最好用滾動陣列,優化一下空間

#include#include

#include

#include

#include

using

namespace

std;

char st[210][210

];struct

node

t[210

];int f[2][210][210

];int list[210

];int

main()

memset(f,-63,sizeof

(f));

f[0][x][y]=0

;

int now=0,last=1

,head,tail;

for(int k=1;k<=k;k++)}}

if(t[k].t==2

) }}

if(t[k].t==3

) }}

if(t[k].t==4

) }}

}int ans=0

;

for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) ans=max(f[now][i][j],ans);

printf(

"%d\n

",ans);

return0;

}

BZOJ1499 NOI2005 瑰麗華爾茲

bzoj luogu 首先有乙個很顯然的 o nmt 的 dp 設 dp t i j 表示 t 時刻鋼琴移動到 i,j 位置的最長滑動距離。轉移分滑動以及不動兩種,判一下障礙物就可以了。這樣有50分。然後發現100 的資料中 k le200 而且在每一段中轉移都是完全一樣的,就考慮把 o nmt 的...

bzoj1499 NOI2005 瑰麗華爾茲

題目鏈結 給出乙個n m的地圖,剛開始人在 x,y 每次給出一段區間 l,r,t 表示在時間 l,r 內,可以使人向4個方向 t 移動一格。求最大可以移動多少格。考慮每一列 上下移 或者一行 左右移 的情況。以右移為例,我們可以很快列出dp方程 f i x y max f i x y f i 1 x...

bzoj 2005 Noi2010 能量採集

description 棟棟有一塊長方形的地,他在地上種了一種能量植物,這種植物可以採集太陽光的能量。在這些植物採集能量後,棟棟再使用乙個能量匯集機器把這些植物採集到的能量匯集到一起。棟棟的植物種得非常整齊,一共有n列,每列有m棵,植物的橫豎間距都一樣,因此對於每一棵植物,棟棟可以用乙個座標 x,y...