华尔兹

$NOI2005$瑰丽华尔兹

一个人想着一个人 提交于 2019-12-03 06:48:49
\(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

P2254 [NOI2005]瑰丽华尔兹

那年仲夏 提交于 2019-12-02 14:28:32
\(P2254\) $ [NOI2005]$ 瑰丽华尔兹 \(f(i,x,y)\) 表示 \(i\) 时刻在 \((x,y)\) 点的最长路径 1900可以固定,也可以随波逐流 \[ f(i,x,y) = \max(f(i-1,x,y),f(i-1,x',y')+1) \] 时间复杂度 \(O(n^2t)\) 爆炸了,只能过一半 再看数据范围,显然 \(O(n^2k)\) 才是正解 考虑同一时间段,停和不停可以化为一段连续的区间(就算你时停时不停,也可以把停放到一起,不停放到一起,并不影响) 也就是说如果按时间段来考虑,可以看做一直在走( 这么明显的东西扯这么半天 ) 设 \(f(i,x,y)\) 表示当前在第 \(i\) 个区间,在 \((x,y)\) 的最长路径 有 \[ f(i,x,y) = \max(f(i-1,x',y')+dis(x',y',x,y)) \] 时间复杂度 \(O(n^3k)\) 但区间长度是有范围的,变化的那一维就有了范围,辣么可以单调队列优化变化的那一维 时间复杂度 \(O(n^2k)\) ,稳过 代码 const int N = 210; int n,m,sx,sy,k,ans,f[N][N]; int dx[] = {0,-1,1,0,0},dy[] = {0,0,0,-1,1}; char a[N][N]; struct node { int