MnZn代码求调
查看原帖
MnZn代码求调
283255
__LYY_p楼主2023/2/22 15:16

样例能过,但WA

#include<iostream>
#include<cstring>
using namespace std;
const int maxm=140,maxn=105;
int dp[maxm][maxn];
int a[maxm][maxn],fa[maxm][maxn];
int m,n;
void printans(int ans,int cnt){
	if(cnt==1)return;
	printans(fa[ans][cnt-1],cnt-1);
	printf("%d ",ans);
}
int main(){
	while(cin>>m>>n){;
		memset(dp,0x3f,sizeof(dp));
		memset(fa,0,sizeof(fa));
		for(int i=1;i<=m;i++){
			for(int j=1;j<=n;j++){
				cin>>a[i][j];
			}
		}
		for(int i=1;i<=m;i++){
			dp[i][1]=a[i][1];
		}
		for(int j=2;j<=n;j++)//列
			for(int i=1;i<=m;i++)/*行*/{
				int dir[]={-1,0,1};
				if(i==1)dir[0]=0,dir[1]=1,dir[2]=-1;
				if(i==m)dir[0]=1,dir[1]=-1,dir[2]=0;
				for(int k:dir){
					int las=i+k;
					if(las==0)las=m;
					if(las>m)las=1;
					if(dp[las][j-1]+a[i][j]<dp[i][j]){
						dp[i][j]=dp[las][j-1]+a[i][j];
						fa[i][j]=las;
					}
				}
			}
		int ans=0;
		for(int i=1;i<=m;i++){
			if(dp[i][n]<dp[ans][n])ans=i;
		}
		printans(fa[ans][n],n);
		printf("%d\n%d\n",ans,dp[ans][n]);
	}
	return 0;
}
2023/2/22 15:16
加载中...