在函数中使用2-d数组

时间:2015-01-21 12:32:49

标签: c++ arrays recursion multidimensional-array dynamic-programming

我正在尝试解决动态编程问题,我需要以二维数组的形式获取用户输入,并使用函数内部的二维数组中的值。 在函数内部使用时,2-d数组的值不会改变。

在函数int dp中我得到了        错误:

声明'a'作为多维数组必须具有除第一个

之外的所有维度的边界
int max(int a,int b,int c)
{
if(a>=b && a>=c)return a;
if(b>=c && b>=a)return b;
else return c;
}
int max2(int a,int b)
{
if(a>b)return a;
else return b;

}


int dp(int i,int j,int a[][],int p,int q)
{
if((i-1)>=0 && (j-1)>=0 &&(i+1)<p &&(j+1)<q )
return  max(a[i][j]+dp(i-1,j+1,a,p,q),a[i][j]+dp(i+1,j+1,p,q),    
    a[i][j]+dp(i,j+1,p,q));
if(i==0 && j!=0 && (j+1)<q)
return max2(a[i][j]+dp(i+1,j+1,p,q),a[i][j]+dp(i,j+1,p,q));

}
int main()
{
int p,q,r,s,T,a,b,i,j,k;
scanf("%d",&T);
for(a=0;a<T;a++)
{
    scanf("%d %d",p,q);
    int z[p][q];
    int max=0;
    for(i=0;i<q;i++)
    {
        for(j=0;j<p-1;j++)
        scanf("%d ",&z[j][i]);
        scanf("%d",&z[j+1][i]);
    }
    for(i=0;i<p;i++)
   {
    if(dp(i,0,z,p,q)>max)
    max=dp(i,0,z,p,q);
   }

  }

   }

4 个答案:

答案 0 :(得分:1)

全部在错误消息中:

  

宣布&#39; a&#39;因为多维数组必须具有除第一个

之外的所有维度的边界

您的函数签名没有a第二维的界限:

int dp(int i,int j,int a[][],int p,int q)
//                     ^^^^^

您需要填入a[][N],其中N是正确的界限。问题是您在这里使用VLA:

scanf("%d %d",p,q);
int z[p][q];

这是非标准的C ++,基本上意味着你不能写dp的签名,因为第二个绑定必须被称为编译时常量。你可以把它变成一维数组:

int* z = new int[p*q];

int dp(int i, int j, int* a, int p, int q)
//                   ^^^^^^

或以2维方式动态分配它,并以这种方式传递它:

int** z = new int*[p];
for (int i = 0; i < p; ++i) {
    z[i] = new int[q];
}

int dp(int i, int j, int** a, int p, int q)
//                   ^^^^^^^

答案 1 :(得分:0)

您收到该错误是因为您不能在函数声明中将{(1}}中的索引(行,列)都清空。您必须同时指定或至少具有列索引的值。

使用动态声明

int a[][]

将参数int **z = new int*[p]; for (int i = 0; i < p; i++) z[i] = new int[q]; 更改为int a[][]

答案 2 :(得分:0)

函数dp需要一些信息来执行有意义的索引计算,这些计算可以由编译器完成,也可以在实际的实现中完成。必须在类型中指定维度,或者参数a可以是int**类型,而其维度作为dp的单独参数提供。由于这是C ++,std::vector< std::vector< int > >类型可能更适合该任务。

答案 3 :(得分:0)

您无法在堆栈上动态声明数组,因为必须在编译时知道大小。执行此操作的唯一方法是使用new关键字为堆上的数组分配内存,然后您可以在运行时声明大小。

然而,更简单的方法是使用容器类,或者在您的情况下,使用容器容器,例如整数向量的向量;

#include <vector>

vector< vector<int> > arrArray(rows, vector<int>(columns)); 

语法可能看起来有点奇怪,但要将其分解;

vector<int> - int

类型的向量

vector< vector<int> > - int

类型的向量向量

arrArray(rows, vector<int>(columns)); - 在第一个参数中,我们说;在我们的数组中创建rowsvector<int>个数,第二个参数将数组初始化为某个值。如果它只是int的2D数组,我们可能会将其初始化为0,或省略第二个参数并依赖于int的默认值。但是,因为我们的多维向量还包含向量,我们设置主向量的每一行来存储int的向量,其中包含columns个整数。

现在您可以像访问任何其他数据一样访问数组;

arrArray[2][0] = 5;

您还可以获得容器类包含的所有附加好处,包括迭代器和许多用于操作和检查数组的有用类方法。一旦理解了创建容器类的语法,您就会发现它们比数组更容易使用。您也不必担心必须管理自己的内存,并且能够在访问向量元素之前进行边界检查。