单调队列优化dp,全WA,求调
查看原帖
单调队列优化dp,全WA,求调
531650
emmc楼主2024/8/15 09:58

rt 单调队列优化dp,全WA,求调

感谢各位大佬

#include <bits/stdc++.h>
using namespace std;
//#define int long long
const int N=210,M=210,inf=1e9;
int n,m,K,x,y;
int mp[N][N];
struct Line{
	int l,r,f;
};
Line l[N];
int dp[M][N][N];
struct node{
    int v,p;
};
deque <node>q;
char s[N];
signed main(){
	//freopen("in.txt","r",stdin);
    cin>>n>>m>>x>>y>>K;
    for(int i=1;i<=n;i++){
    	cin>>s+1;
    	for(int j=1;j<=m;j++){
    		mp[i][j]=(s[j]=='.'?0:1);
		}
	}
	for(int i=1;i<=K;i++){
		cin>>l[i].l>>l[i].r>>l[i].f;
	}
	int ans=0;
	for(int i=0;i<=K;i++) for(int j=1;j<=n;j++) for(int k=1;k<=m;k++) dp[i][j][k]=-inf;
	dp[0][x][y]=0;
	for(int i=1;i<=K;i++){
		int cd=l[i].r-l[i].l+1;
		if(l[i].f==4){
			for(int j=1;j<=n;j++){
				q.clear();
				for(int k=1;k<=m;k++){
					while(!q.empty() and q.front().p<k-cd) q.pop_front();
					if(mp[j][k]==1){
						q.clear();
						continue;
					}
					while(!q.empty() and q.back().v+k-q.back().p<=dp[i-1][j][k]) q.pop_back();
					q.push_back({dp[i-1][j][k],k});
					dp[i][j][k]=max(dp[i][j][k],q.front().v+k-q.front().p);
				}
			}
		}
		if(l[i].f==3){
			for(int j=1;j<=n;j++){
				q.clear();
				for(int k=m;k>=1;k--){
					while(!q.empty() and q.front().p>k+cd) q.pop_front();
					if(mp[j][k]==1){
						q.clear();
						continue;
					}
					while(!q.empty() and q.back().v+q.back().p-k<=dp[i-1][j][k]) q.pop_back();
					q.push_back({dp[i-1][j][k],k});
					dp[i][j][k]=max(dp[i][j][k],q.front().v+q.front().p-k);
				}
			}
		}
		if(l[i].f==1){
			for(int k=1;k<=m;k++){
				q.clear();
				for(int j=n;j>=1;j--){
					while(!q.empty() and q.front().p>j+cd) q.pop_front();
					if(mp[j][k]==1){
						q.clear();
						continue;
					}
					while(!q.empty() and q.back().v+q.back().p-j<=dp[i-1][j][k]) q.pop_back();
					q.push_back({dp[i-1][j][k],j});
					dp[i][j][k]=max(dp[i][j][k],q.front().v+q.front().p-j);
				}
			}
		}
		if(l[i].f==2){
			for(int k=1;k<=m;k++){
				q.clear();
				for(int j=1;j<=n;j++){
					while(!q.empty() and q.front().p>j-cd) q.pop_front();
					if(mp[j][k]==1){
						q.clear();
						continue;
					}
					while(!q.empty() and q.back().v-q.back().p+j<=dp[i-1][j][k]) q.pop_back();
					q.push_back({dp[i-1][j][k],j});
					dp[i][j][k]=max(dp[i][j][k],q.front().v-q.front().p+j);
				}
			}
		}
	}
	for(int i=0;i<=K;i++) for(int j=1;j<=n;j++) for(int k=1;k<=m;k++) ans=max(ans,dp[i][j][k]);
	cout<<ans<<endl; 
    return 0;
}

2024/8/15 09:58
加载中...