区间dp入门总结以及本周感悟

本周学习的区间dp
acm的学习好像是快要告一段落了,但是就目前来看,很多的知识还没有学习,而且我目前发现自己有几个很大的弊端(或者说是大学期间对自己而已很必要的一些学习技能和生活技能:

1.很多情况下,身体劳累带动精神劳累
因为最近一直在锻炼身体,身体累的之后一休息就时间过去了,精神劳累休息时间长了之后就会转化为精神偷懒,这导致我本身是用锻炼来发泄情绪来增强学习能力的过程变成了促使自己偷懒的过程,这是需要改变的地方
我认为以后锻炼的时间可以变得更为灵活,比如晚自习下自习之后可以延长学习的时间到9.40然后去跑步,跑到大概10点附近就可以回宿舍洗漱,然后腾出时间来回顾今天的所做所学。

2.如今学习即将告一段落,总结所学到的知识是重点
acm学习的东西很多,大部分是扩展自己的视野,虽然当初抱着想要进入acm校队参加比赛的想法来的,但是如今发现这个事情可能并不适合我去做,难度对于我来说太高了,很多情况下,并不是通过努力能过赢得的,但是我尽力了,不后悔。
总结当前学到的知识和学习知识中遇到的困难是很重要的事情,总结之前的事情是可以找到宝贵的经验的,用来克服之后遇到的困难并少走弯路。学习什么样的知识有用,学习什么样的知识无用,总结过后才能更加清晰明了。

3.掌握学习知识的途径和需要学习什么样的知识
发现需要学习的知识,并找到学这个知识的途径,我发现这是在大学学习期间,或者说是获得自学能力中最为关键的一环之一,这关系着自己未来是否能够发现热点知识,把握住未来。
csdn虽然说是一个很方便的资料搜寻网站,但是我发现如果过于依赖csdn,并不是一件好事,所以我要寻找其他的途径来获得知识。
看视频不适合我,时间耗费过大,获取知识不多,期间多次走神。
搜寻资料,搜题解,研究解题过程和思路,研究课本的知识点,这才是适合我的道路。

区间dp

区间dp就是在区间上进行动态规划,求解一段区间上的最优解。主要是通过合并小区间的 最优解进而得出整个大区间上最优解的dp算法

核心思路

求解在一个区间上的最优解,那么把这个区间分割成一个个小区间,求解每个小区间的最优解,再合并小区间得到大区间即可。所以在代码实现上,我们可以枚举区间长度len为每次分割成的小区间长度(由短到长不断合并),内层枚举该长度下可以的起点,自然终点也就明了了。然后在这个起点终点之间枚举分割点,求解这段小区间在某个分割点下的最优解。

大概意思就是两次for循环,一次定义起点,一次定义起点到终点的长度,这样的话就能枚举每一个不同的长度区间,并在枚举的过程中得到最优解

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);
            }
        }
    }

区间dp交线性dp的区别真的很难找,而且dp类的题目真的让人头大,目前明白了两重for循环定义枚举方式是一种类型,而其他的区间dp模型还要继续消化消化
这里发现一个很有用的博文

https://blog.csdn.net/qq_43472263/article/details/98337401?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161927688616780264057241%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=161927688616780264057241&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_click~default-2-98337401.first_rank_v2_pc_rank_v29&utm_term=%E5%8C%BA%E9%97%B4dp&spm=1018.2226.3001.4187
区间dp其实就是一种建立在线性结构上的对区间的动态规划,dp本来就是很奇妙的东西,也没有什么套路,就是一种思考的数学思维方式,只有做足够多的题并且想的足够多才可能在比赛中做出来。

区间dp,顾名思义,在区间上dp,大多数题目的状态都是由区间(类似于dp[l][r]这种形式)构成的,就是我们可以把大区间转化成小区间来处理,然后对小区间处理后再回溯的求出大区间的值,主要的方法有两种,记忆化搜索和递推。

在用递推来求解时,关键在于递推是for循环里面的顺序,以及dp的关键:状态转移方程。

当然大部分的区间dp都是有特点的,我们可以考虑符合什么条件下,大区间可以转化成小区间,然后找出边界条件,进行dp求解。

———————————————— 版权声明:本文为CSDN博主「木每立兄豪」的原创文章,遵循CC 4.0
BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_43472263/article/details/98337401

通过阅读大佬的文字,我对区间dp又增加了一些理解

memset(dp,0,sizeof(dp))//初始dp数组
for(int len=2;len<=n;len++){//枚举区间长度
    for(int i=1;i<n;++i){//枚举区间的起点
        int j=i+len-1;//根据起点和长度得出终点
        if(j>n) break;//符合条件的终点
        for(int k=i;k<=j;++k)//枚举最优分割点
            dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+w[i][j]);//状态转移方程
    }
}
         
        

以上是一个区间dp的案例,这个是一个很能提升理解区间dp的模板。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值