首页 > 代码库 > dp 感悟

dp 感悟

能且最大最小的问题:

//function

        for (int i = 1; i < A.length; i++) {

            can[i] = Integer.MAX_VALUE;

            for (int j = 0; j <= i; j++) {

               if (can[j] != Integer.MAX_VALUE && j + A[j] >= i)  {

                   can[i] = Math.min(can[i], can[j] + 1);

               }

            }\

数组求和或求和的最大值问题:

//function

        for (int i = 1; i <= n; i++) {

             for (int j = 1; j <= k && j <= i; j++) {

                 for (int l = 1; l <= target; l++) {

                    

                    f[i][j][l] = f[i - 1][j][l];

                    if (l >= A[i - 1]) {

                        f[i][j][l] += f[i - 1][j - 1][l - A[i - 1]];

                    }

                }

            }

        }

//function

         for (int i = 1; i <= A.length; i++) {

             for (int j = 1; j <= m; j++) {

                f[i][j] = f[i - 1][j];

                if (j >= A[i - 1]) {

                    f[i][j] = Math.max(f[i - 1][j], f[i - 1][j - A[i - 1]] + V[i - 1]);

                }

        }

 

状态: 多为要求值, 方程多为所求值和前一个值和后一个的关系.遍历、比较、遍历+ 比较、遍历 + 状态判断+ 题设要求; 初始化多为边界和起始值的初始化.

 

Sequence 题要加判断

 

Function: 与上一个状态之间的关系: 根据要求 求和、求最大值。最小值。状态为true.

 

数组题和String 题, sub 题sequence 题多为和上一个状态, 遍历上一个(另一个)指针在的位置 + 判断+ (分类), 求结果递推。String题多为多开辟一个空间

 

Sub题(common题)多为二维, 多为判断当前的元素是否与……相等, 然后(操作当前元素和不操作当前元素)  当前元素在sub里和不在sub里两种递推结果.  当前元素改为…, 或者当前元素时sub的最后一个元素

技术分享

技术分享

技术分享

技术分享

 

dp 感悟