根据以下输入,数组值的a[2][2]
位置应为-5
1
3
3
-2 -3 3
-5 -10 1
10 30 -5
但是当我运行此代码时,它会在a[2][2]
显示值为0,不知道为什么。我确信我没有更新数组中的值。
#include<stdio.h>
#include<limits.h>
#include<string.h>
#include<math.h>
#define min(a,b) a<b?a:b
int m,n;
int func(int i,int j,int a[][101],int dp[][101])
{
if(i>=m||j>=n)
{
printf("i=%d j=%d intmax\n",i,j);
return INT_MAX;
}
if(i==m-1&&j==n-1)
{
if(a[i][j]<0)
{
printf("i=%d j=%d return abs a[i][j]%d\n",i,j,abs(a[i][j]));
return abs(a[i][j]);
}
printf("i=%d j=%d a[i][j]=%d return 0\n",i,j,a[i][j]);
return 0;
}
if(dp[i][j]!=-1)
{
printf("returning dp=%d\n",dp[i][j]);
return dp[i][j];
}
int t1=func(i+1,j,a,dp);
int t2=func(i,j+1,a,dp);
t1=min(t1,t2);
if(a[i][j]<0)
{
dp[i][j]=t1+abs(a[i][j]);
}
else
{
t1=t1-a[i][j];
dp[i][j]=(t1>0?t1:0);
}
printf("t1=%d i=%d j=%d dp=%d\n",t1,i,j,dp[i][j]);
return dp[i][j];
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int dp[101][101];
scanf("%d%d",&m,&n);
int i,j,a[m][n];
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
dp[i][j]=-1;
}
}
//for(i=0;i<m;i++)
//for(j=0;j<n;j++)
//printf("%d ",a[i][j]);
printf("%d\n",func(0,0,a,dp)+1);
}
return 0;
}
答案 0 :(得分:5)
关于你传递给它的内容,func
的原型是不正确的。你传递了一个包含三个int
的三个数组的数组,但该函数需要一个 101 int
数组的数组。
您需要将m
和n
作为参数传递给函数,而不是将它们作为全局变量传递,并在参数n
的声明中使用a
。像
int func(int i, int j, int m, int n, int a[][n],int dp[][101]) { ... }