ZOJ 3872--解题报告
题目相关:
3872相关链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5520
Edward拥有一组数列. 其定义了Beauty数: 连续子串的和(重复的项只计算一次). 比如子串: 2, 3, 3. 则总和为beauty=2+3= 5 (数值3只计算一次).
目标: 求一组数列中, 所有Beauty数的总和.
思路分析:
• 评估数据:
数据规模: 数列的长度为N (1 <= N <= 100000)
数值范围: 成员都是正整数, 且大小不大于1000000.
由此可得, 子串个数为N*(N-1)/2, 而最终的总数最大范围为 N*N*M = 10^5 * 10^5 * 10^6 = 10^16, 超过4位int/long范围, 尚在8位long long的表示范围内.
• 思路权衡
采用暴力的方式去解决, 枚举每个子串, 显然不可行. 就算子串的和计算为O(1), 由于子串个数N*(N-1)/2的数据规模10^10, 显然不行.
关于计数/累计和的问题时, 往往可以采取动态规划的方式来简化这个问题.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 设定opt[k]表示序列以第k个元素结尾的所有子串和, val[k]为数组的第k个元素数值. 如果不考虑重复数据不得累加的问题, 则递进公式为: opt[k] = opt[k - 1] + delta(k) * val[k] = opt[k - 1] + k * val[k] opt[k]在opt[k-1]对应的所有子串基础上, 尾部添加val[k]项组成新子串. 总共添加k次. 然而由于重复数字只计算一次的限制, 该公式需要修正. 引入索引映射idx, 其key为数值, value表示该数值最后出现的索引位置. 修正的核心为: delta(k) = 新子串数 - 忽略次数 = k - idx[val[k]] 注: idx[val[k]]为val[k]最后出现的索引位置, 在这之前的子串因该数值已出现过, 视为忽略. 于是递进公式演变为: opt[k] = opt[k - 1] + delta(k) * val[k] = opt[k - 1] + (k - idx[val[k]]) * val[k]; 最后结果为: result = opt[1] + opt[2] + ... + opt[n] 这样总得时间复杂度为O(N). |
AC代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #include <cstdio> #include <map> typedef long long LL; int main() { int kase; scanf ( "%d" , &kase); while ( kase-- > 0 ) { int n; scanf ( "%d" , &n); std::map< int , int > kbmap; LL opt_sum = 0, total_sum = 0; int val; for ( int i = 1; i <= n; i++ ) { scanf ( "%d" , &val); opt_sum = opt_sum + (i - kbmap[val]) * val; total_sum += opt_sum; kbmap[val] = i; } printf ( "%ld\n" , total_sum); } return 0; } |
posted on 2015-05-29 16:58 mumuxinfei 阅读(483) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构