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的最后一个元素

时间: 2024-11-29 02:37:58

dp 感悟的相关文章

区间dp的感悟

学区间dp似乎也很久了...对区间dp的通用模型都了解了一些 但是做题还是很坑 上了一点难度的题基本想不出什么思路.. 目前的做题方式就是看题 想一会发现自己不会做 看题解 好巧妙啊 理解后写一发.. 还是准备记载一下自己对区间dp的一点感悟 区间dp很多枚举区间长度的做法 一般是n^3 好像数据范围都不会太大的样子 问题和区间有关 或者加一个完成xx的状态 预处理比较重要 一般是在dp数组上搞事情 也有一些题是利用dp数组搞预处理 hdu2476 就是这样的 题目的套路和普通dp不太一样 感觉

数位dp对于状态描述与发现的一些感悟

今天刷的数位dp 第一题看了题解以后知道了数位dp的基本板子,写数位dp的方式(运用记忆化递归的方法)已经基本固定. 那么接下来的难点主要还是对于题目描述的问题,如何抽象成dp中的状态.就今天刷的题来看,dp数组第一维一般为第i位数,这是数位dp的一般表示数的方式.而数组究竟还要加几维就要看题目要求的东西. 如下题: http://acm.hdu.edu.cn/showproblem.php?pid=3709 题意即求: 对于某个 number,你可以 fix a pivot 在某位,然后如果分

hdu2859 dp

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2859 题意:输入一个数n,接下来是一个由n*n个字母组成的矩阵,求以左下到右上的线为轴的最大对称阵的大小. 思路:就是dp,,,我最大的感悟就是dp要是想明白了,代码贼简单,想不懂就是死难..思路么,看下面的图就懂了. 代码: #include<iostream> #include<cstdio> #include<algorithm> #include<

Codeforces #316 E Pig and Palindromes DP

// Codeforces #316 E Pig and Palindromes // // 题目大意: // // 给你一张地图,n*m每个点是一个字母,现在从(0,0)出发, // 每次只能往右或者往下走,求走到(n-1,m-1)形成回文串的方法数. // // 解题思路: // // 动态规划.首先.如果起点和终点的字母不相同,那么肯定 // 不能形成回文串,直接输出0.对于能形成回文串.我们设状态 // d(step,i,j)表示走了step步,从第0行走到i行,第n-1行走到j行的 /

ACM感悟(转载)

这是一篇转载的感悟,感觉写的非常好,有助于我们在ACM上少走弯路,所以就分享一下. 链接:http://www.cnblogs.com/Chierush/p/3760870.html 声明:本文是写给弱校ACM新手的一点总结,受自身水平和眼界所限,难免会有一些个人主观色彩,希望大牛指正 感谢@Wackysoft .@哇晴天 . @ 一切皆有可能1 的指教,现根据这些建议,文章已进行修改 先简单介绍一下自己: 高中在OI打过一段时间酱油,大一后暑假进入ACM集训队,到大三寒假,总共一年半的ACM生

uva 11361 Investigating Div-Sum Property 数位dp

// uva 11361 Investigating Div-Sum Property 数位dp // // 题目大意: // // 给你一个整数a和一个整数b,问在[a,b]范围内,有多少个自身被k整除并且 // 各位数之和也能被k整除.比如k = 7 ,322满足条件,因为332能被整除7,并 // 3 + 2 + 2 = 7 也能被7整除 // // 解题思路: // // 求一个区间的题目,这类题目,往往可以转化为不超过x的f(x).则最后要求 // 的就是f(b) - f(a-1).如

ACM感悟

声明:本文是写给弱校ACM新手的一点总结,大牛请无视 先简单介绍一下自己: 高中在OI打过一段时间酱油,大一后暑假进入ACM集训队,到大三寒假,总共一年半的ACM生涯. 总共参加了四场比赛:区域赛一银(2013长春)一铜(2013杭州)一铁(2012金华),省赛狗血一银(2013山东) 总共有过5位队友 个人感觉SDUST ACM集训队的最大缺点就是经验得不到继承,几乎每一届都是从零开始,我们11级更是这样 下面是我一年半以来根据平常对11级队员习性的了解和各个队员最后的兴衰得出的一些经验,当然

802.1W 感悟以及和802.1D对比

上次说了STP的感悟,这次讲讲我个人对与RSTP的感悟.(学校坑爹的开题报告,没时间写微博了) RSTP的出现的原因:就是因为传统的STP是基于被动的收敛时间,收敛时间太慢,根本无法满足真正的生产网络,网络震荡一次,就得等30S-50S,才能上网,估计谁也忍不了吧! 对于如何对RSTP下手呢?我总结如下两点,STP也可以这么考虑 ①如何形成一棵树 ②如何维护这个树(随时检测树的状态,当树根被拔了,当树干断了,如何用新的树根和新的树干来再次形成这棵逻辑的树) 802.1D: 形成树:先选举root

uva live 3516 Exploring Pyramids 区间DP

// uva live 3516 Exploring Pyramids 区间DP // // 题目大意: // // 给你一个多叉树,每个节点是一个大写字母,从根节点走,按照先序遍历的 // 原则访问,不能访问则回溯,每次记录一下节点的字符,最后得到一个字符串.现 // 在给你一个字符串,问可能符合条件的多叉树的数量. // // 解题思路: // // 区间DP,我们注意到,从根节点出发,一定会再次回到根节点,那么我们可以设 // d(i,j) 是序列i到j段形成的符合条件的多叉树的数量,则