救救蒟蒻吧(样例过了,提交WA
查看原帖
救救蒟蒻吧(样例过了,提交WA
330381
zhangchengyan楼主2022/8/29 18:40

RT,代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,a[105][105],dp[105][105],ans[105][105];
void print(ll x,ll y)
{
	if(x==0)
	  return;
	print(ans[x][y],y-1);
	cout<<x<<' ';
}
int main()
{
	while(~scanf("%lld%lld",&n,&m))
	{
		memset(dp,0x3f,sizeof(dp));
		memset(ans,0,sizeof(ans));
		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][1]=a[i][1];
		for(int j=1;j<m;++j)
		  for(int i=1;i<=n;++i)
		  {
		  	ll x,y;
		  	if(i==1)
		  	  x=n,y=2;else
		  	if(i==n)
		  	  x=n-1,y=1;else
		  	  x=i-1,y=i+1;
		  	if(dp[i][j]+a[x][j+1]<dp[x][j+1])
		  	  dp[x][j+1]=dp[i][j]+a[x][j+1],ans[x][j+1]=i;
		  	if(dp[i][j]+a[i][j+1]<dp[i][j+1])
		  	  dp[i][j+1]=dp[i][j]+a[i][j+1],ans[i][j+1]=i;
		  	if(dp[i][j]+a[y][j+1]<dp[y][j+1])
		  	  dp[y][j+1]=dp[i][j]+a[y][j+1],ans[y][j+1]=i;
		  }
		int ansid=0;
		for(int i=1;i<=n;++i)
		  if(dp[ansid][m]>dp[i][m])
		    ansid=i;
		print(ans[ansid][m],m-1);
		cout<<ansid<<'\n'<<dp[ansid][m]<<'\n';
	}
	return 0;
}
2022/8/29 18:40
加载中...