有点好奇
查看原帖
有点好奇
368204
ShanQing楼主2022/10/13 22:14

为什么n和m的顺序会影响结果
本人很蒟,望解答
这是原来的代码

#include <bits/stdc++.h>
using namespace std;
int dp[150][55][55],w[55][55],n,m;
bool in(int a,int b)
{
	return a>0&&a<=n&&b>0&&b<=n;
}
int main()
{
	//freopen("P1006_4.in","r",stdin);
	scanf("%d%d",&n,&m);
	//printf("%d",n);
	for(int i=1;i<=m;i++)
	{
		for(int j=1;j<=n;j++)
		{
			scanf("%d",&w[i][j]);
		}
	}
	for(int k=2;k<=n+m;k++)
	{
		for(int i1=1;i1<=m;i1++)
		{
			for(int i2=1;i2<=m;i2++)
			{
				int j1=k-i1;
				int j2=k-i2;
				if(i1==1&&i2==1) continue;
				if(!in(j1,j2)) continue;
				int t=w[i1][j1];
				if(i1!=i2) t+=w[i2][j2];
				dp[k][i1][i2]=max(dp[k][i1][i2],dp[k-1][i1-1][i2-1]+t);
				dp[k][i1][i2]=max(dp[k][i1][i2],dp[k-1][i1-1][i2]+t);
				dp[k][i1][i2]=max(dp[k][i1][i2],dp[k-1][i1][i2-1]+t);
				dp[k][i1][i2]=max(dp[k][i1][i2],dp[k-1][i1][i2]+t);
			}
		}
	}
	printf("%d\n",dp[n+m][m][m]);
	return 0;
}

60分 这是AC的代码,唯一的区别是n和m

#include <bits/stdc++.h>
using namespace std;
int dp[150][55][55],w[55][55],n,m;
bool in(int a,int b)
{
	return a>0&&a<=m&&b>0&&b<=m;
}
int main()
{
	//freopen("P1006_4.in","r",stdin);
	scanf("%d%d",&n,&m);
	//printf("%d",n);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			scanf("%d",&w[i][j]);
		}
	}
	for(int k=2;k<=n+m;k++)
	{
		for(int i1=1;i1<=n;i1++)
		{
			for(int i2=1;i2<=n;i2++)
			{
				int j1=k-i1;
				int j2=k-i2;
				if(i1==1&&i2==1) continue;
				if(!in(j1,j2)) continue;
				int t=w[i1][j1];
				if(i1!=i2) t+=w[i2][j2];
				dp[k][i1][i2]=max(dp[k][i1][i2],dp[k-1][i1-1][i2-1]+t);
				dp[k][i1][i2]=max(dp[k][i1][i2],dp[k-1][i1-1][i2]+t);
				dp[k][i1][i2]=max(dp[k][i1][i2],dp[k-1][i1][i2-1]+t);
				dp[k][i1][i2]=max(dp[k][i1][i2],dp[k-1][i1][i2]+t);
			}
		}
	}
	printf("%d\n",dp[n+m][n][n]);
	return 0;
}

当然有可能是对这道题的思路理解得不够透彻,望指出

2022/10/13 22:14
加载中...