Pergunta

Estou executando blocos de código no compilador Mingw em uma máquina virtual XP. Eu escrevi em algum código simples, acessível em CL1P , que responde à pergunta do algoritmo em Codechef (Bem, ele apenas responde em parte, pois ainda não incluí o loop para vários casos de teste.

No entanto, meu problema é que, ao executá -lo no modo de depuração, ele fornece a saída correta de 5, para a entrada:

3
1
2 1
1 2 3

No entanto, quando eu construo e executo, ele fornece a produção enorme e absurda 131078, o que me parece lixo. Não entendo como diabos isso está acontecendo, mas estou supondo que tenha algo a ver com a alocação de memória dinâmica. Qual é o problema aqui e como posso corrigi -lo? Eu até o corri pelo compilador online em Botskool, e funcionou bem. Depois de adicionar o loop para casos de teste, o código funcionou corretamente no Codechef!

#include <iostream>

using namespace std;

int main()
{
    // Take In number of rows
    int numofrows;
    cin >> numofrows;

    // Input Only item in first row
    int * prevrow;
    prevrow = new int[1];
    cin >> prevrow[0];

    // For every other row
    for (int currownum = 1; currownum < numofrows; currownum++)
    {
        // Declare an array for that row's max values
        int * currow;
        currow = new int[currownum+1];

        int curnum;
        cin >> curnum;

        // If its the first element, max is prevmax + current input
        currow[0] = prevrow[0] + curnum;

        // for every element
        int i = 1;
        for (; i <= currownum; i++)
        {
            cin >> curnum;

            // if its not the first element, check whether prevmax or prev-1max is greater. Add to current input
            int max = (prevrow[i] > prevrow[i-1]) ? prevrow[i] : prevrow[i-1];

            // save as currmax.
            currow[i] = max + curnum;
        }

        // save entire array in prev
        prevrow = new int[i+1];
        prevrow = currow;
    }

    // get highest element of array
    int ans = 0;
    for (int j=0; j<numofrows; j++)
    {
        if (prevrow[j] > ans)
        {
            ans = prevrow[j];
        }
    }

    cout << ans;
}
Foi útil?

Solução

Por um lado, isso:

    //save entire array in prev
    prevrow = new int [i+1];
    prevrow = currow;

Copia o ponteiro, não toda a matriz.

Outras dicas

Execute o código através do Valgrind em uma máquina Linux e você ficará surpreso com quantos lugares seu código está vazando memória. Se você estiver tomando o caminho difícil de gerenciar sua memória, faça bem e 'exclua' toda a memória recém-alocada antes de alocar mais. Se, por outro lado, você preferir a estrada fácil, use um vetor de std :: e esqueça sobre o gerenciamento da memória.

Em seu loop, você tem esta linha

int max = (prevrow[i]>prevrow[i-1])?prevrow[i]:prevrow[i-1];

Na primeira iteração do loop principal, quando currownum == 1, o loop contendo esta linha será inserido, como i é inicializado para 1. Mas na primeira iteração, prevrow Somente um elemento e essa linha tenta acessar prevrow[1]. Em uma construção de depuração, a memória simplesmente é inicializada para zero, mas em uma compilação normal, você obtém algum valor de lixo que estava na memória, levando ao resultado que você vê.

Praticamente sempre, quando você obtém valores de lixo em uma construção normal, mas tudo está bem em uma construção de depuração, você está acessando alguma memória não inicializada.

Além disso, seu programa está vazando memória como louca. Por exemplo, você não precisa atribuir nenhum resultado de new dentro do loop para prevrow Porque logo depois você muda prevrow para apontar para outro bloco de memória alocada. Além disso, você deve ligar delete Para qualquer memória que você não esteja mais usando.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top