区间DP 小笔记

总体思想

  用许多的小区间 的最优解, 进行递推->,最终得到一个大区间(即答案区间)的最优解

关键点

  一、确定起点、终点、分割点

  二、确认初始化——如:数组初值——一个极小值或极大值

  三、确认特殊赋值——如:无需操作的区间赋为0

  四、首先枚举长度,再枚举起点——

        如果先枚举起点,再枚举长度的话,那么从这个点为起点的一些大区间就被提前算了,但实际上,大区间是用小区间推出来的,这样做就不对了。

 

板子_-_-_

for (int len = 1; len <= n; len++) //枚举长度
{ 
    for (int j = 1; j + len <= n + 1; j++) //枚举起点,且 ends<=n
    { 
        int ends = j + len - 1; //终点
        for (int i = j; i < ends; i++) //枚举分割点,更新小区间最优解
        { 
            dp[j][ends] = min(dp[j][ends], dp[j][i] + dp[i + 1][ends] + something); //一个大区间由它中间的小区间得到
            //注意这里i的范围,i+1<=ends
        }
    }
}

 

posted @ 2020-10-20 11:25  everlasting_k  阅读(107)  评论(3)    收藏  举报
Live2D