近期感触
突然发现了dp与选择算法在结构上的类似
这周主要看题主要还是dp区间
区间dp`
区间DP是把一个大区间拆分成几个小区间,
先求小区间的最优值,然后合并起来求大区间的最优值。
然后一般问题的最优解会集中在dp[1][n]的位置;
规定dp[i][j]为合并第i堆到第j堆的最小花费
DP方程为:
dp[i][j] = min(dp[i][k] + dp[k+1][j]) + sum[j] - sum[i-1] (i <= k < j)
常见区间dp的模板:
//一般区间DP实现代码
memset(dp, 0x3f, sizeof(dp));
for (int i = 1; i <= n; i++) //区间长度为1的初始化
dp[i][i] = 0;
for (int len = 2; len <= n; len++) //枚举区间长度
{
for (int i = 1, j = len; j <= n; i++, j++) //区间[i,j]
{
//DP方程实现
}
}
然后会有根据思路问题的嵌套
区间dp不怎么好理解 整体结构比较容易能想得到 但是在定义dp操作处理时对二维数组的成员理解上拿捏上会想很长时间 总感觉定义完后数组中间有一部分是空着的 就像开始时接触基础dp[i][j]二维数组的引用定义难以理解 近期多锻炼一下这种思想
The 7th day after the last setback.