对本题的一些疑问
查看原帖
对本题的一些疑问
195331
Mine_KingCattleya楼主2020/7/6 11:51

RT。
老师造了这题的数据,具体是什么数据我不知道,但是这份代码:

#include<cstdio>
#define int long long
using namespace std;
int n,m,a[105][105];
int dp[105][105],pre[105][105];
int num,k,b[105];
void print(int l,int x)
{
	if(l==1)
	{
		printf("%lld ",x);
		return ;
	}
	print(l-1,pre[l][x]);
	printf("%lld ",x);
}
signed main()
{
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++) scanf("%lld",&a[i][j]),dp[i][j]=-1e9;
	dp[n][0]=-1e9;
	for(int i=1;i<=m-n;i++) dp[1][i]=a[1][i];
	for(int i=2;i<=n;i++)
		for(int j=i;j<=m-(n-i);j++)
			for(int k=i-1;k<j;k++)
				if(dp[i-1][k]+a[i][j]>dp[i][j])
				{
					dp[i][j]=dp[i-1][k]+a[i][j];
					pre[i][j]=k;
				}
	for(int i=n;i<=m;i++)
		if(dp[n][i]>dp[n][num]) num=i;
	printf("%lld\n",dp[n][num]);
	print(n,num);
	return 0;
}

挂了,而这份代码:

#include<cstdio>
#define int long long
using namespace std;
int n,m,a[105][105];
int dp[105][105],pre[105][105];
int num,k,b[105];
void print(int l,int x)
{
	if(l==1)
	{
		printf("%lld ",x);
		return ;
	}
	print(l-1,pre[l][x]);
	printf("%lld ",x);
}
signed main()
{
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++) scanf("%lld",&a[i][j]),dp[i][j]=-1e9;
	dp[n][0]=-1e9;
	for(int i=1;i<=m;i++) dp[1][i]=a[1][i];
	for(int i=2;i<=n;i++)
		for(int j=i;j<=m-(n-i);j++)
			for(int k=i-1;k<j;k++)
				if(dp[i-1][k]+a[i][j]>dp[i][j])
				{
					dp[i][j]=dp[i-1][k]+a[i][j];
					pre[i][j]=k;
				}
	for(int i=n;i<=m;i++)
		if(dp[n][i]>dp[n][num]) num=i;
	printf("%lld\n",dp[n][num]);
	print(n,num);
	return 0;
}

不同之处:

for(int i=1;i<=m-n;i++) dp[1][i]=a[1][i];
for(int i=1;i<=m;i++) dp[1][i]=a[1][i];

请问为什么第一篇代码过不了?

2020/7/6 11:51
加载中...