求助!在线等!急!
查看原帖
求助!在线等!急!
136816
hhhwg07楼主2021/7/28 23:59

udebug的数据都可以通过,但WA了

#include<bits/stdc++.h>
using namespace std;
#define rep(i,s,e) for(int i=s;i<=e;i++)
#define REP(i,s,e) for(int i=s;i>=e;i--)
#define LL long long
#define U unsigned
const int N=110;
int m,n,a[N][N],dp[N][N],last[N][N],sz;
string s[N];
queue<int> qx,qy;
void add(int x,int y){
	if(last[x][y]!=-1)add(x-1,last[x][y]);
	s[sz]+='0'+y-1;
}
int main(){
	while(scanf("%d%d",&m,&n)==2){
		rep(i,1,m)rep(j,1,n)scanf("%d",a[j]+i);
		if(m==1){
			int cnt=0;
			rep(i,1,n)printf("1 "),cnt+=a[i][1];
			printf("\n%d\n",cnt);
			continue; 
		}
		rep(i,1,n){
			dp[i][1]=min(dp[i-1][m],min(dp[i-1][1],dp[i-1][2]))+a[i][1];
			rep(j,2,m-1)dp[i][j]=min(dp[i-1][j],min(dp[i-1][j-1],dp[i-1][j+1]))+a[i][j];
			dp[i][m]=min(dp[i-1][1],min(dp[i-1][m],dp[i-1][m-1]))+a[i][m];
		}
		memset(last,0,sizeof(last));
		rep(i,1,m)qx.push(1),qy.push(i),last[1][i]=-1;
		while(!qx.empty()){
			int x=qx.front(),y=qy.front();qx.pop(),qy.pop();
			int d[3]={y-1,y,y+1};
			if(y==1)d[0]=1,d[1]=2,d[2]=m;
			if(y==m)d[0]=1,d[1]=m-1,d[2]=m;
			rep(i,0,2)if(!last[x+1][d[i]]&&dp[x][y]+a[x+1][d[i]]==dp[x+1][d[i]])last[x+1][d[i]]=y,qx.push(x+1),qy.push(d[i]);
		}
		int ans=2e9;sz=0;
		rep(i,1,m)ans=min(ans,dp[n][i]);
		rep(i,1,m)if(dp[n][i]==ans)s[++sz]="a",add(n,i);
		sort(s+1,s+1+sz);
		rep(i,1,n)printf("%d ",s[1][i]-'0'+1);
		printf("\n%d\n",ans);
	}
	return 0;
} 
2021/7/28 23:59
加载中...