区间dp

来源:互联网 发布:北京电脑编程学校 编辑:程序博客网 时间:2024/06/05 00:31

关于区间dp的理解

一直不知道这玩意,研究了一下才发现学长原先讲过(跑 )

前导算法
dp

算法干嘛:
这种算法可以解决一类问题,这类问题,大区间的最优解,可以由构成它的小区间的最优解组合生成。

算法思路:
既然大区间的答案,可以由小区间,组合生成,
那我们就像搭积木一样从小区间,一直求到大区间。
区间越小数目越多,我们需要一一求解所有的区间,因为,每一个区间都有可能是更大区间的基石。
区间合并时,因为谁也不知道,如何合并是最优的,所以可能需要枚举所有的可能。(据说可以优化)

算法阶段:
1. 枚举区间的长度
2.枚举区间的起始段
3.枚举区间的断点
4.状态转移方程

个人感觉
核心感觉是第4点,其实就是如何进行区间合并
然后我感觉这是一种非常暴力的算法 0.0

模板

for(int i=1;i<n;i++){ //枚举区间长度 i+1     for(int j=1;j+i<=n;j++){//枚举区间左端点         for(int k=1;k<=i;k++){//枚举分割点,前k个为一组             if(dp[j][j+i]==0)  dp[j][j+i]=dp[j][j+k-1]+dp[j+k][j+i]+sum(j,j+i);            dp[j][j+i]=minn(dp[j][j+i],dp[j][j+k-1]+dp[j+k][j+i]+sum(j,j+i)); //状态转移方程         }    }}

这些题大家可以练习(遇到补充)

1.nyoj737 石子归并
区间dp or 分治? :求合并的最小代价
我写的题解

原创粉丝点击