Решение для динамического программирования не работает в среде Hackerrank

#c

#c

Вопрос:

Мой код отлично работает на моей машине, но он терпит неудачу даже в примерах тестов на Hackerrank. Как один и тот же код может давать разные результаты в двух разных средах?

 #include <bits/stdc  .h>
#include <algorithm>
using namespace std;

int maxum(int arr[], int n)
{
    int t[100][100];
    for(int i=0;i<n 1; i  )
        for(int j=0; j<n 1;j  )
        {
            if(i==0)
                t[i][j]=0;
            else
                t[i][j]=max(t[i-1][j] arr[i-1], t[i-1][j] );
        }
    int maximum=0;
    for(int i=0;i<n 1;i  )
    for(int j=0; j<n 1;j  )
    {
        if(t[i][j]>maximum)
        maximum=t[i][j];
    }
    return maximum;
}


int main()
{
    int arr[100],i,n;
    cin>>n;
    for(i=0;i<n;i  )
        cin>>arr[i];
    cout<<maxum(arr,n);
    return 0;
}
  

Комментарии:

1. Можете ли вы рассказать нам, каков один из простых тестовых примеров? Это сэкономит много времени, если вы сможете.

2. Также может помочь объяснить, что должен делать код.

3. Что, если n равно 99?

4. В какой ссылке C говорится об использовании нестандартного включаемого файла bits/stdc .h ? Вашему коду нужно только #include <iostream> ; использование двух других является пустой тратой времени на сборку.

5. К вашему сведению, использование описательных имен переменных оказывает незначительное влияние на процесс сборки, но затрудняет чтение кода. У вас есть по крайней мере 26 ^ 32 возможных комбинации букв для имен переменных, поэтому используйте более описательные имена.

Ответ №1:

Алгоритм просто неправильный. Например, учитывая входные данные из первого тестового примера

 5
3 7 4 6 5
  

Правильный ответ — 13 (7 6), но ваш код выводит 25 (3 7 4 6 5).

Похоже, не реализовано требование, чтобы члены максимального подмножества были несмежными.

Комментарии:

1. Я запустил те же тестовые примеры в моем Dev C , и он выдал 13 в качестве выходных данных. Что здесь происходит?

2. Понятия не имею. Вот мой тестовый пример godbolt.org/z/fbGaKn

3. На самом деле я написал его рекурсивную версию и, имея небольшие знания о DP, попытался преобразовать ее в это. Это действительно работало на моей машине, но здесь оно показывает разные ответы. Можете ли вы попробовать запустить его на своем компьютере и проверить?

4. Я не понимаю. Значит, разработчики C ошибочны?

5. @cyberhawk Я только что запустил код на своем локальном компьютере, тот же неверный результат, 25.

Ответ №2:

Ваш код демонстрирует неопределенное поведение, по крайней мере, для больших входных данных. Пример:

 g   -O3 -Wall -Wextra -pedantic -std=c  17 -fno-exceptions -fsanitize=address a.cpp
yes 100 | ./a.out
  

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

 ==298664==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffce142a650 at pc 0x55697440f74d bp 0x7ffce14209c0 sp 0x7ffce14209b8
WRITE of size 4 at 0x7ffce142a650 thread T0
    #0 0x55697440f74c in maxum(int*, int) (/tmp/a.out 0x174c)
    #1 0x55697440f26c in main (/tmp/a.out 0x126c)
    #2 0x7fc97926acc9 in __libc_start_main ../csu/libc-start.c:308
    #3 0x55697440f3a9 in _start (/tmp/a.out 0x13a9)

[rest of asan output omitted]