$NOI2005$瑰丽华尔兹
\(NOI2005\) 瑰丽华尔兹 单调队列实现好题。 设 \(f[k][i][j]\) 表示第 \(k\) 段区间在 \((i,j)\) 出的最优答案。 \(f[k][i][j]=max(f[k-1][I][J]+Dis)\) ( \(Dis\) 是距离, \((I,J)\) 是上一个合法位置。懒得写了。。。) 考虑单调队列加滚动数组解决 \(MLE,TLE\) 的问题。。。 在遇到障碍物时清零队列即可。。。 注意在将 \(f[i][j]\) 加入队列之前,不能更新答案,因为我们的 \(max\) 是 \(k-1\) 的 \(max\) ,更新之后回锅。。。 #include<bits/stdc++.h> using namespace std; inline int read() { int f=1,w=0;char x=0; while(x<'0'||x>'9') {if(x=='-') f=-1; x=getchar();} while(x!=EOF&&x>='0'&&x<='9') {w=(w<<3)+(w<<1)+(x^48);x=getchar();} return w*f; } const int N=250; struct Group{int Val,Stp;} Q[N]; int n,m,Sx,Sy,K,ans,Mp[N][N],f[N][N]; int dx