Optimal Partition (线段树优化DP)

给定一个数组 a(1n5×105),你需要将其分割为若干个连续的子数组,使所有子数组的价值总和最大。

定义价值是:

  • r-l+1,和 >0
  • 0, 和=0
  • -(rl+1), 和<0;

思路:

  • 首先这道题初步想的时候 考虑到贪心和dp
  • 贪心贪不出来,就马上转dp
  • 直接暴力想 是 n^2
  • 那么就要考虑优化
  • dp优化就要从转移式子入手
  • 暴力公式:
    • dp[i]  max=  dp[j] + (i-j)  dp[i]=max(dp[j]+(ij)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]+(ji)),sum(j + 1, i)<0

          利用前缀和 优化 sum

    • 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  - is[i] < s[j]
  • 于是就出来了, 将 s[i], 里面的值进行离散化, 然后以他作为下标来建树
  •  然后 这个线段树来保存上面的最大值, 分别查询前段,后端,和自己就行拉;

后记:

  • 当正解不好想的时候就 暴力做, 看能不能想出一种方法做出来
  • 然后在想优化的方法.
posted @ 2022-10-11 08:29  VxiaohuanV  阅读(36)  评论(0编辑  收藏  举报