标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。