给定一个数组 a,(1≤n≤5×105),你需要将其分割为若干个连续的子数组,使所有子数组的价值总和最大。
定义价值是:
- r-l+1,和 >0
- 0, 和=0
- -(r−l+1), 和<0;
思路:
- 首先这道题初步想的时候 考虑到贪心和dp
- 贪心贪不出来,就马上转dp
- 直接暴力想 是 n^2
- 那么就要考虑优化
- dp优化就要从转移式子入手
- 暴力公式:
-
- dp[i] max= dp[j] + (i-j) dp[i]=max(dp[j]+(i−j)) sum(j + 1, i)} > 0
- dp[i] max= dp[j] dp[i]=max(dp[j]),{sum(j + 1, i)} = 0
- dp[i] max= dp[j] + (j-i) dp[i]=max(dp[j]+(j−i)),sum(j + 1, i)<0
利用前缀和 优化 sum
- dp[i] max= dp[j] + (i-j) dp[i]=max(dp[j]+(i−j)) sum(j + 1, i)} > 0
- dp[i] max= dp[j] - j + i,s[i] > s[j]
- dp[i] max=dp[i],s[i] = s[j]
- dp[i] max= dp[j] + j - i,s[i] < s[j]
- 于是就出来了, 将 s[i], 里面的值进行离散化, 然后以他作为下标来建树
- 然后 这个线段树来保存上面的最大值, 分别查询前段,后端,和自己就行拉;
后记:
- 当正解不好想的时候就 暴力做, 看能不能想出一种方法做出来
- 然后在想优化的方法.