35pts求条
查看原帖
35pts求条
1437066
wangjunhe楼主2025/7/29 15:25

https://www.luogu.com.cn/record/227587983

#include<bits/stdc++.h>
using namespace std;
int c,T,n,m,s,k,a[1005][1005],dp[1005];
int pd(int x){
	if(x<0)
		return -1;
	else if(x>k)
		return k;
	else
		return x;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>c>>T;
	while(T--){
		cin>>n>>m>>s>>k;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				cin>>a[i][j];
		for(int i=1;i<=n;i++)
			dp[i]=s;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++)
				if(dp[j]>=0)
                    dp[j]=pd(dp[j]+a[i][j]);
            if(i==n)
                break;
			priority_queue<pair<int,int>>q;
            int maxx=-1e9;
			for(int j=1;j<=m;j++)
				maxx=max(maxx,a[i][j]);
			if(maxx<0)
				break;
			for(int j=1;j<=m;j++)
				if(dp[j]>=0)
					q.push({dp[j],j});
			while(q.size()){
				auto d=q.top();
				q.pop();
				int z=d.first,u=d.second;
				if(dp[u]>z)continue;
				vector<int>dy={u-1,u+1};
				for(auto v:dy){
					if(v<1||v>m)continue;
					if(a[i][u]+a[i][v]>0){
						int h=pd(k+a[i][v]);
						if(dp[v]<h){
							dp[v]=h;
							q.push({dp[v],v});
						}
					}
					else if(pd(a[i][v]+dp[u])>dp[v]){
						dp[v]=pd(a[i][v]+dp[u]);
						q.push({dp[v],v});
					}
				}
			}
		}
        int maxx=-1;
		for(int i=1;i<=m;i++)
			maxx=max(maxx,dp[i]);
		cout<<maxx<<endl;
	}
	return 0;
}
2025/7/29 15:25
加载中...