有乙個字元矩陣,'.'表示能走,'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...