题目传送门https://www.luogu.com.cn/problem/SP30394。
解题思路: 线性筛 + 动态规划 dp + 前缀和。
用线筛筛出这个序列中的所有质数,我不想多说。
代码如下:
int prime_shai()
{
cnt = 0;
p[0] = p[1] = 1;
for (register int i = 2; i < N; i++){
if (!p[i]) prime[++cnt] = i;
for (register int j = 1; j <= cnt && i * prime[j] < N; j++){
p[i * prime[j]] =1;
if (i % prime[j] == 0) break;
}
}
return cnt;
}
以 dp_i 为结尾,若 j≤i 且 j 是质数,能得到 dp_{i-j-1}。(题目要求不能相邻。)
得到动态转移方程:
源代码
复制
dp[j]=max(dp[j], sum[j] - sum[t] +dp[max(t-1,0)])
之后取 dp_j和 dp_{j-1} 的最大值即可。
动态规划:
for (int j = 1; j <= n; j++)
{
dp[j]=dp[j-1];
for (int k = 1; k <= cnt && prime[k] <= j; k++)
{
int t=j-prime[k];
dp[j]=max(dp[j], sum[j] - sum[t] +dp[max(t-1,0)]);//动态规划。
}
dp[j]=max(dp[j],dp[j-1]);
ans = max(ans, dp[j]);
}//取最大值。
前缀和:如果你不知道的话,请看这个。
代码就是这上面代码的模板。