NC235948 最大子串和
[NC235948] 最大子串和
1 | 时间限制:C/C++ 1秒,其他语言2秒 |
题目描述
给你一个数组 $a$ ,包含 $n$ 个整数,你需要在其中选择连续的几个(至少一个)数,使得它们的和最大,求出最大的和。
输入描述:
第一行输入一个正整数 $n(1\le n\le10^6)$ , 表示数组 $a$ 大小.
第二行输入 $n$ 个整数 $a_1,a_2,\dots,a_n(-10^9\le n \le 10^9)$ , 表示数组 $a$ .
输出描述:
示例1
输入
1 | 6 |
输出
1 | 9 |
说明
1 | 你可以选择区间[3,6]的子串,他们的和为5+2−3+5=9。 |
示例2
输入
1 | 8 |
输出
1 | 6 |
题解
题目解析
这个题目使用的方法是动态规划(dp),其时间复杂度是$O(n)$级别.
动态规划的状态转移方程为:
解释一下,$dp[i]$的意思为以$i$位置的数字为子串结尾的最大值,其状态转移方程的解释为:以$i$位置的数字为子串结尾的最大值=$\max$(以$i-1$位置的数字为子串结尾的最大值+第$i$位置的数字,第$i$位置的数字),也就是前面的最大值加上当前值和当前值进行比较,哪个大留哪个.
AC代码
1 |
|
吐槽+小技巧
真的是第一次见这种求最大值方法,记下了记下了.20号要考省赛了,好紧张.
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Xunyoyo!