kavinderrana121 Ответов: 1

Codeforces 455A динамическое программирование


Ребята я новичок в конкурентном программировании я решал одну задачуhttps://codeforces.com/problemset/problem/455/A Я взял решение и попробовал его понять ,я понимаю это хорошо ,но у меня есть небольшое сомнение

#include<bits/stdc++.h>
    using namespace std;
    #define MAX 100005
    long long dp[100005];
        long long count1[100005];
        int main(){
        int n,x;
        cin>>n;
        for(int i=0;i<n;i++){
            cin >> x;
            count1[x]++;
           // res=max(res,x);
        }
        dp[0]=0;
        dp[1]=count1[1];
        for(int i=2;i<MAX;i++){
            dp[i]=max(dp[i-1],dp[i-2]+i*count1[i]);
        }
        cout<<dp[MAX-1];
    }


Что я уже пробовал:

НО КАК ВЫ МОЖЕТЕ ВИДЕТЬ ,ЧТО ЦИКЛ РАБОТАЕТ MAX(100005) ДАЖЕ ДЛЯ НЕБОЛЬШИХ ТЕСТОВЫХ СЛУЧАЕВ, КОГДА Я ПЫТАЮСЬ ОПТИМИЗИРОВАТЬ, ЧТО Я ПРИДУМАЛ РЕШЕНИЕ

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

int main(){
    long long dp[100005];
    long long count1[100005];
    int n;
    cin>>n;

    int x;
    int res=-100000;

    for(int i=0;i<n;i++){
        cin >> x;
        count1[x]++;
        res=max(res,x);
    }

    dp[0]=0;
    dp[1]=count1[1];

    for(int i=2;i<=res;i++){
        dp[i]=max(dp[i-1],dp[i-2]+i*count1[i]);
    }

    cout<< dp[res];


}



НО ЭТО ДАЕТ НЕПРАВИЛЬНЫЙ ОТВЕТ НА ТЕСТОВЫЙ СЛУЧАЙ 12 https://codeforces.com/contest/455/submission/47841668

Может ли кто-нибудь сказать мне, где я совершил ошибку ? Почему этот конкурентоспособный программист допускает такую ошибку, это нормально?

Richard MacCutchan

1. Пожалуйста, не кричите: использование верхнего регистра считается криком.
2. В чем собственно проблема с вашим кодом?

Rick York

Лучше всего использовать отладчик в случае сбоя.

1 Ответов

Рейтинг:
7

KarstenK

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

Мой совет заключается в том, что ваш res ошибочен и/или не нужен.

//initial set all to zero
long long dp[100005]={0};
long long count1[100005]={0};
 
for(int i=2;i<(n+2);i++){
        dp[i]=max(dp[i-1],dp[i-2]+i*count1[i]);
}