?
题意:这题题意确实有点难懂,起码对于我这个英语渣渣来说是这样,于是去别人的博客看了下题目意思,归纳起来如下:
给出一个长度为n的数列,将其分成若干段,要求
最小,其中ai是每一段数列的第一项,bi是每一段的长度,l为将数列分成l段。
比如样例:n=7,A={1 2 4 4 5 4 3},将其分成1 2 4| 4 5| 4| 3,则其所用空间为1*2^3+4*2^2+4*2^1+3*2^1=38,而如果分成1 2| 4 4 5| 4 3,则其所用空间为1*2^2+4*2^3+4*2^2=52,比38大。
?
本弱菜见解:
分成数段,而且每段的求和的值 在这一段元素中 只与第一个元素值有关,还有就是跟这段长度有关,所以区间DP做起来比较清晰,做区间DP一向不太喜欢直接来推一把,喜欢记忆化搜索的来一把,只与头元素有关,那么一层一层搜下去,不是很复杂的dfs过程
dp[i]表示 以元素num[i]为开头 的最小的 那个什么值,
?
?
#include
#include
#include
#include
#include
#include
#include
#include
#include
?
记忆化搜索是向下一层一层找的,那么在直接推的时候 我也是想着一个一个往后推此时所得到的最优解,意思就是dp[i]表示 从第一个推到第i个的时候最优解,还需要一层循环j来 枚举 前i个的 最后一段的长度为j的所有结果中寻找 最优解
?
#include
#include
#include
#include
#include
#include
#include
#include
#include