一直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;
}