Я пытаюсь решить вопрос динамического программирования на hackerearth. Даже после попытки моделирования логики с использованием ручки и бумаги я не могу понять решение (данное в editorial). Может кто-нибудь объяснить прокомментированные строки? Любая помощь будет принята с благодарностью. Я пытался понять это в течение 3 дней ...Сложная логика dp
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 5e3+5;
bool vis[MAXN];
int ar[MAXN];
int pre[MAXN];
vector<int> v;
int dp[MAXN];
void sieve() {
v.push_back(2);
for(int i=3;i<MAXN;i+=2) if(!vis[i]) {
v.push_back(i);
for(int j=i*i;j<MAXN;j+=2*i) vis[j]=true;
}
}
int main() {
// freopen("TASK.in","r",stdin);
// freopen("TASK.out","w",stdout);
int n;
cin>>n;
assert(n<=5000);
for(int i=1;i<=n;i++) {
scanf("%d",&ar[i]);
assert(ar[i]<=100000);
pre[i]=pre[i-1]+ar[i];
}
sieve();
dp[0]=dp[1]=0;
for(int i=2;i<=n;i++) {
dp[i]=dp[i-1];
for(int j=0;j<(int)v.size() and v[j]<=i;j++) {
int p=i-v[j]-1;//please explain this line
if(p==-1) dp[i]=max(dp[i],pre[i]);
else dp[i]=max(dp[i],dp[p]+pre[i]-pre[p+1]);// please explain this line
}
}
cout<<dp[n]<<endl;
return 0;
}
@ Josh Lee Я выделил часть, которая нуждается в разъяснении. Понятно, что вы не прочитали всего описания, поэтому, пожалуйста, удалите трюм – coder
Вопросы должны быть разумно автономными; ваш вопрос абсолютно бессмыслен без страниц, на которые он ссылается. Что делать, если эти страницы опускаются (временно или постоянно)? Что делать, если у кого-то есть тот же вопрос, что и вы, и пытается найти Stack Overflow, чтобы узнать, уже ли он ответил? Что делать, если кто-то имеет ограниченное сетевое подключение и не хочет рисковать щелчком по вашим ссылкам? – ruakh
@ks 1322 кажется, что люди не любят отвечать на вопросы dp – coder