-4

Я пытаюсь решить проблему динамического программирования, и мне нужно взять пользовательский ввод в виде 2-мерного массива и использовать значения из 2-го массива внутри функция. Значения 2-мерного массива не будут изменены при использовании внутри функции.Использование 2-мерного массива в функции

В функции Int дп Я получаю ошибку:

декларацию «а» многомерный массив должен иметь оценки для всех размеров, кроме первого

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); 
    } 

    } 

    } 
+2

1) Используйте несколько букв для имен переменных. 2) Если это C++, то почему бы не использовать стандартный контейнер, например 'std :: vector'? – Michael

ответ

0

Вы получаете эту ошибку, потому что вы не может оставить как индекс (строка, столбец) пустым в int a[][] в объявлении функции. У вас должно быть как указано, так и указано значение индекса столбца.

Использование динамической декларации

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

Изменить параметр int a[][] для int **a

+0

Я не могу этого сделать, потому что размеры массива должны быть взяты у пользователя – user3692108

+0

Если я делаю что-то вроде int a [] [] для int a [p] [q], тогда он показывает ошибку. Это p и q - это примечание, объявленное в этот объем – user3692108

1

Это все в сообщении об ошибке:

declaration of 'a' as multidimensional array must have bounds for all dimensions except the first

Ваша функция подписи не имеет границ для a «s 2 размер:

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

Необходимо заполнить его a[][N], где N - это правильная граница. Проблема в том, что вы используете Влас здесь:

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) 
//     ^^^^^^^ 
0

Функция dp необходима информация для выполнения значимого индекса вычисления, выполняемые компилятором или в фактической реализации. В типе необходимо указать либо измерение, либо аргумент a может иметь тип int**, а его размеры представлены в виде отдельных аргументов dp. Поскольку это C++, тип задачи std::vector< std::vector<int> > может быть более подходящим для задачи.

0

Вы не можете динамически объявлять массив в стеке, поскольку размер должен быть известен во время компиляции. Единственный способ сделать это - выделить память для массива в куче, используя ключевое слово new, тогда вы можете объявить размер во время выполнения.

Проще, однако, было бы просто использовать контейнерный класс или в вашем случае контейнер контейнеров, такой как вектор вектора ints;

#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> в нашем массиве, а второй параметр инициализирует массив некоторым значением. Если бы это был всего лишь 2D-массив из int, мы могли бы включить его в 0 или опустить второй параметр и полагаться на значение по умолчанию int. Но поскольку наш многомерный вектор также содержит векторы, мы устанавливаем каждую строку нашего основного вектора для хранения вектора int, который содержит columns количество целых чисел.

Теперь вы можете получить доступ к массиву, как и любой другой;

arrArray[2][0] = 5; 

Вы получаете также все дополнительные преимущества, которые содержат классы контейнеров, включая итераторы и много полезных методы класса для манипулирования и проверки вашего массива. После того, как вы понимаете синтаксис создания классов контейнеров, вам будет гораздо легче работать с массивами. Вам также не нужно беспокоиться о необходимости управлять собственной памятью и иметь возможность выполнять проверку границ перед доступом к векторным элементам.