我正在尝试解决动态编程问题,我需要以二维数组的形式获取用户输入,并使用函数内部的二维数组中的值。 在函数内部使用时,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);
}
}
}
答案 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));
- 在第一个参数中,我们说;在我们的数组中创建rows
个vector<int>
个数,第二个参数将数组初始化为某个值。如果它只是int
的2D数组,我们可能会将其初始化为0
,或省略第二个参数并依赖于int
的默认值。但是,因为我们的多维向量还包含向量,我们设置主向量的每一行来存储int
的向量,其中包含columns
个整数。
现在您可以像访问任何其他数据一样访问数组;
arrArray[2][0] = 5;
您还可以获得容器类包含的所有附加好处,包括迭代器和许多用于操作和检查数组的有用类方法。一旦理解了创建容器类的语法,您就会发现它们比数组更容易使用。您也不必担心必须管理自己的内存,并且能够在访问向量元素之前进行边界检查。