单调队列优化DP,球跳
  • 板块P3800 Power收集
  • 楼主K_J_M
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/9 16:18
  • 上次更新2024/8/9 16:57:03
查看原帖
单调队列优化DP,球跳
1353330
K_J_M楼主2024/8/9 16:18
#include<bits/stdc++.h>
using namespace std;
const int N = 4e3+10;
int n,m,k,x,y,v,t;
int a[N][N],dp[2][N],q[N];
int main(){
	cin>>n>>m>>k>>t;
	for(int i=1;i<=k;i++){
		cin>>x>>y>>v;
		a[x][y]=v;
	}
	int head=1,tail=0;
	for(int i=1;i<=m;i++) dp[1][i]=a[1][i];
	for(int i=2;i<=n;i++){
		for(int j=1;j<=t;j++){
			while(head<=tail&&dp[(i-1)&1][j]>dp[(i-1)&1][q[tail]]) tail--;
			q[++tail]=j;
		}//先将前t个放入单调队列 
		for(int j=1;j<=m;j++){
			if(j+t<=m){
				while(head<=tail&&dp[(i-1)&1][j+t]>dp[(i-1)&1][q[tail]]) tail--;
				q[++tail]=j+t;
				while(q[head]<j-t) head++;
			}
			dp[i&1][j]=dp[(i-1)&1][q[head]]+a[i][j];
		}
		head=1,tail=0;
	}
	int ans=0;
	for(int i=1;i<=m;i++) ans=max(ans,dp[n&1][i]);
	cout<<ans;
	return 0;
}

用了滚动数组

2024/8/9 16:18
加载中...