P1043 [NOIP2003 普及组] 数字游戏
时间: 2023-09-17 21:10:41 浏览: 145
题目描述
有一个长度为n(n<=100)的数字串,求出其中所有的连续子串中,各个数位数字之和的最大值是多少。
输入格式
第一行是一个整数n(n<=100)。
第二行是n个数字字符。
输出格式
一个整数,表示各个数位数字之和的最大值。
样例输入
6
123123
样例输出
9
提示
此题也可用O(n)的时间复杂度求解。
算法1
(暴力枚举) $O(n^3)$
枚举出所有的连续子串,再计算它们的各位数字之和。
时间复杂度
枚举子串需要 $O(n^2)$ 的时间,每次计算各位数字之和,需要 $O(n)$ 的时间,所以总时间复杂度为 $O(n^3)$。
空间复杂度
不需要额外的空间,所以空间复杂度为 $O(1)$。
算法2
(动态规划) $O(n)$
设置一个数组 $f[i]$ 表示以第 $i$ 个位置结尾的子串中各位数字之和的最大值,那么 $f[i]$ 的值可以从两个位置转移而来:
- $f[i] = max(f[i], f[i-1] + num[i])$,即当前位置的值加上前一个位置的最大值;
- $f[i] = max(f[i], num[i])$,即当前位置的值比前一个位置的最大值更大。
转移方程为:$f[i] = max(f[i], f[i-1]+num[i], num[i])$。
时间复杂度
只需要遍历一次数组,所以时间复杂度为 $O(n)$。
空间复杂度
需要一个 $f$ 数组来记录各个位置的最大值,所以空间复杂度为 $O(n)$。
C++ 代码
算法1
相关问题
p1045 [noip2003 普及组] 麦森数
这道题目是要求求出一个数组的马蜂数,马蜂数定义为数组中任意两个数相差为1的数对的个数。通过遍历数组,判断当前数字和前一个数字的差值是否为1,如果是,则统计一个马蜂数。最后统计完所有的数对,输出结果即可。
p1179 [noip2010 普及组] 数字统计
题目描述
给定一个正整数n,统计所有满足<=i<=n且数字m出现在i中的数i的个数。
输入格式
一个正整数n和一个数字m。
输出格式
一个整数,表示满足条件的数的个数。
输入样例
12 1
输出样例
5
算法1
(暴力枚举) $O(nlogn)$
blablabla
时间复杂度
参考文献
python3 代码
算法2
(暴力枚举) $O(nlogn)$
blablabla
时间复杂度
参考文献
C++ 代码
算法3
(暴力枚举) $O(nlogn)$
blablabla
时间复杂度
参考文献
Java 代码
算法4
(暴力枚举) $O(nlogn)$
blablabla
时间复杂度
参考文献
C# 代码
算法5
(暴力枚举) $O(nlogn)$
blablabla
时间复杂度
参考文献
Go 代码
算法6
(暴力枚举) $O(nlogn)$
blablabla
时间复杂度
参考文献
Scala 代码
算法7
(暴力枚举) $O(nlogn)$
blablabla
时间复杂度
参考文献
JavaScript 代码
算法8
(暴力枚举) $O(nlogn)$
blablabla
时间复杂度
参考文献
Ruby 代码
算法9
(暴力枚举) $O(nlogn)$
blablabla
时间复杂度
参考文献
Swift 代码
算法10
(暴力枚举) $O(nlogn)$
blablabla
时间复杂度
参考文献
Kotlin 代码
阅读全文