【问题标题】:Confusing logic of dpdp的混乱逻辑
【发布时间】:2017-01-11 20:17:44
【问题描述】:

我正在尝试解决hackerearth 上的动态编程问题。 即使在尝试使用笔和纸模拟逻辑之后,我也无法理解解决方案(在editorial 中给出)。 有人可以解释评论的行吗?任何帮助将不胜感激。我已经尝试理解了 3 天...

#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 我已经强调了需要解释的部分。似乎您还没有阅读完整的描述,所以请删除保留
  • 问题应该是合理的独立的;如果没有链接到的页面,您的问题绝对没有意义。如果这些页面(暂时或永久)关闭怎么办?如果其他人有与您相同的问题,并尝试搜索 Stack Overflow 以查看是否已被回答,该怎么办?如果某人的网络连接有限,不想冒险点击您的链接怎么办?
  • @ks 1322 似乎人们不喜欢回答 dp 问题
  • @coder,请注意,发布到editorial 的链接是没有用的,因为它对我来说是锁定的,我想这里的每个人都是这样。
  • @ks1322 很抱歉,我认为社论是对所有人开放的,已将代码放在这里,希望现在一切正常

标签: c++ algorithm dynamic-programming


【解决方案1】:

这里array pre代表前缀和,vector v包含MAXN下面的素数。您评论的第一行是
int p=i-v[j]-1;
这里v[j] 是从2 开始的jth 质数,dp[i] 是第一个i 问题的最佳分数。如果您解决了v[j] 连续问题的数量(从i 并向后退),那么您从一开始就剩下i - v[j] 问题。 -1 来自于你不能从i (向后)解决(v[j] - 1) th 问题(如果你这样做,你将解决v[j] + 1 连续问题,这些问题不是质数,因为v[j] 是质数)。

您已评论的第二行:
dp[i]=max(dp[i],dp[p]+pre[i]-pre[p+1]);
它从上面得出,因为如果您从i(向后)解决v[j] 问题,您将获得pre[i]-pre[p+1] 点,然后将其与dp[p] 相加,这是您已经为p 获得的最佳结果。例如,如果 i = 10v[j] = 3 你会得到 dp[10] = max (dp[10],dp[6]+pre[10]-pre[7]) 这就是你所期望的。

【讨论】:

  • @xashru 感谢您提供如此精美的解释,我在 3 天后一直在努力理解它,非常感谢。希望我能拿回我的分数
猜你喜欢
  • 1970-01-01
  • 2021-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
  • 2019-04-14
  • 1970-01-01
相关资源
最近更新 更多