求助刚刚比赛T4
  • 板块学术版
  • 楼主WsW_花逝爆零人
  • 当前回复4
  • 已保存回复4
  • 发布时间2025/7/27 17:35
  • 上次更新2025/7/27 21:20:49
查看原帖
求助刚刚比赛T4
349824
WsW_花逝爆零人楼主2025/7/27 17:35

一直WA了几个样例,然后我加了一个循环就AC了。但我感觉还是错的,请大家帮忙看看。

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;
typedef unsigned long long ull;
int n,m,s;
ll k;
ll a[1003][1003];
ll dp[1003][1003];
void init(){
	memset(dp,0,sizeof(dp));
	memset(a,0,sizeof(a));
	n=m=s=k=0;
}
void work(){
	init();
	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 j=1;j<=m;j++){
		dp[1][j]=min(k,s+a[1][j]);
		if(j>1&&a[1][j-1]+a[1][j]>0){
			dp[1][j-1]=min(k,max(dp[1][j-1],k+a[1][j-1]));
			dp[1][j]=min(k,max(dp[1][j],k+a[1][j]));
//			cerr<<j<<' '<<k+a[1][j]<<"<<\n";
		}
		if(j<m&&a[1][j+1]+a[1][j]>0){
			dp[1][j+1]=min(k,max(dp[1][j+1],k+a[1][j+1]));
			dp[1][j]=min(k,max(dp[1][j],k+a[1][j]));
		}
	}
	for(int j=2;j<=m;j++){
		if(dp[1][j-1]>=0)dp[1][j]=min(k,max(dp[1][j],dp[1][j-1]+a[1][j]));
		if(a[1][j-1]+a[1][j]>0){
			dp[1][j-1]=min(k,max(dp[1][j-1],k+a[1][j-1]));
			dp[1][j]=min(k,max(dp[1][j],k+a[1][j]));
		}
	}
	for(int j=m-1;j>0;j--){
		if(dp[1][j+1]>=0)dp[1][j]=min(k,max(dp[1][j],dp[1][j+1]+a[1][j]));
		if(a[1][j+1]+a[1][j]>0){
			dp[1][j+1]=min(k,max(dp[1][j+1],k+a[1][j+1]));
			dp[1][j]=min(k,max(dp[1][j],k+a[1][j]));
		}
	}
	//以上为第1行 
	//处理1~n-1行 
	for(int i=2;i<n;i++){
		for(int j=1;j<=m;j++){
			if(dp[i-1][j]<0)dp[i][j]=-1;
			else dp[i][j]=min(k,dp[i-1][j]+a[i][j]);
		}
		for(int j=1;j<=m;j++){
			if(j>1&&a[i][j-1]+a[i][j]>0&&
			(dp[i][j-1]>=0||dp[i][j]>=0)){
				dp[i][j-1]=min(k,max(dp[i][j-1],k+a[i][j-1]));
				dp[i][j]=min(k,max(dp[i][j],k+a[i][j]));
			}
			if(j<m&&a[i][j+1]+a[i][j]>0&&
			(dp[i][j+1]>=0||dp[i][j]>=0)){
				dp[i][j+1]=min(k,max(dp[i][j+1],k+a[i][j+1]));
				dp[i][j]=min(k,max(dp[i][j],k+a[i][j]));
			}
		}
		for(int ii=1;ii<=10;ii++){//这里,神秘循环。
			for(int j=2;j<=m;j++){
				if(dp[i][j-1]>=0)dp[i][j]=min(k,max(dp[i][j],dp[i][j-1]+a[i][j]));
				if(a[i][j-1]+a[i][j]>0&&
				(dp[i][j-1]>=0||dp[i][j]>=0)){
					dp[i][j-1]=min(k,max(dp[i][j-1],k+a[i][j-1]));
					dp[i][j]=min(k,max(dp[i][j],k+a[i][j]));
				}
			}
			for(int j=m-1;j>0;j--){
				if(dp[i][j+1]>=0)dp[i][j]=min(k,max(dp[i][j],dp[i][j+1]+a[i][j]));
				if(a[i][j+1]+a[i][j]>0&&
				(dp[i][j+1]>=0||dp[i][j]>=0)){
					dp[i][j+1]=min(k,max(dp[i][j+1],k+a[i][j+1]));
					dp[i][j]=min(k,max(dp[i][j],k+a[i][j]));
				}
			}
		}
	}
	ll ans=-1;
	for(int j=1;j<=m;j++){
		if(dp[n-1][j]>=0)ans=max(ans,dp[n-1][j]+a[n][j]); 
	}
	cout<<min(k,ans)<<'\n';
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	int c,T; cin>>c>>T;
	while(T--)work();
	return 0;
}
2025/7/27 17:35
加载中...