测试点2段错误RE
  • 板块P1464 Function
  • 楼主akl123
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/8/12 21:34
  • 上次更新2023/11/3 04:11:41
查看原帖
测试点2段错误RE
1057681
akl123楼主2023/8/12 21:34

在下一开始写的记忆化,然后原本其他测试点都过了结果测试点2显示Segmentation fault with invalid memory reference。在下初学不太理解段错误是什么意思于是便查了一下紫书,上面似乎是说是递归次数过多导致的栈溢出,于是我便将原先的递归改为了递推,结果依然在同一个测试点上因为相同的原因RE。请问这种问题究竟应该如何解决?烦请诸位不吝赐教。 附上递推代码:

#include<iostream>
using namespace std;
long long a[21][21][21];
long long b[10001];long long c[10001];long long d[10001];long long ans[10001];
long long w(long long x, long long y,long long z)
{
	if(x<=0||y<=0||z<=0)
	 return 1;
	else
	if(x>20||y>20||z>20)
	 return w(20,20,20);
	else
	if(a[x][y][z]!=0)
	 return a[x][y][z];
	else
	if(x<y&&y<z) 
	{
		a[x][y][z]=w(x,y,z-1)+w(x,y-1,z-1)-w(x,y-1,z);
		return a[x][y][z];
	}
	else 
	{
		a[x][y][z]=w(x-1,y,z)+w(x-1,y-1,z)+w(x-1,y,z-1)-w(x-1,y-1,z-1);
		return a[x][y][z];
	}
}
int main()
{
	int p,o,i;
	for(p=0;p<=20;p++)
	 for(o=0;o<=20;o++)
	  for(i=0;i<=20;i++)
	  {
	  	 if(p==0||o==0||i==0)
	  	 {
		   a[p][o][i]=1;
	  	   continue;	
		 }
	  	 else if(p<o&&o<i) a[p][o][i]=a[p][o][i-1]+a[p][o-1][i-1]-a[p][o-1][i];
	  	 else a[p][o][i]=a[p-1][o][i]+a[p-1][o-1][i]+a[p-1][o][i-1]-a[p-1][o-1][i-1];
	  }
	for(i=0;;i++)
	{
		cin>>b[i]>>c[i]>>d[i];
		if(b[i]==-1&&c[i]==-1&&d[i]==-1)
		 break;
		if(b[i]<=0||c[i]<=0||d[i]<=0) ans[i]=1;
		else if(b[i]>20||c[i]>20||d[i]>20) ans[i]=a[20][20][20];
		else ans[i]=a[b[i]][c[i]][d[i]];
	}
	for(int j=0;j<i-1;j++)
	  cout<<"w("<<b[j]<<", "<<c[j]<<", "<<d[j]<<") = "<<ans[j]<<endl; 
	cout<<"w("<<b[i-1]<<", "<<c[i-1]<<", "<<d[i-1]<<") = "<<ans[i-1];
	return 0;
}
2023/8/12 21:34
加载中...