ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

cf958 C2. Encryption (medium)(dp)

2021-12-31 19:05:36  阅读:178  来源: 互联网

标签:medium 题意 切成 max 总分 C2 dp 长为


题意:

把长为n的数组切成k段,每段的得分为段中的数之和模p。问总分最大是多少(总分不用模p)

n <= 2e4,k <= 50,p <= 100

思路:

先考虑朴素dp。\(f(i,k)\) 表示把第 \(1\sim i\) 个数切成 \(k\) 段的最大答案,则 \(f(i,k) = max _{j<i} \{ f(j,k-1) + s[i]-s[j] \}\),其中 \(s[]\) 为前缀和取模。复杂度 \(O(n^2k)\) ,会超时。

优化:注意到p很小,\(f(s[i],k)=max _{0\le s' < p} \{f(s',k-1) + s[i]-s' \}\)

memset(f, 0xcf, sizeof f), f[0][0] = 0;

for(int i = 1; i <= n; i++)
for(int ss = 0; ss < p; ss++)
for(int k = 1; k <= K; k++)
    f[s[i]][k] = max(f[s[i]][k], f[ss][k-1] + (s[i] - ss + p) % p);
    
cout << f[s[n]][K];

标签:medium,题意,切成,max,总分,C2,dp,长为
来源: https://www.cnblogs.com/wushansinger/p/15754194.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有