1 条题解
-
0
自动搬运
来自洛谷,原作者为

柒命九陨_
**搬运于
2025-08-24 21:37:35,当前版本为作者最后更新于2018-08-07 09:11:37,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
是区间DP良心水题了qwq。
所以大家为什么都开的是二维数组呢,明明一维就好的。
题意唯一有干扰的是从后面删数的这个选择,但是稍微一想就知道每次从前面删数一直删到最后,最优解是不变的,最后留下的也是我们曾要从后面删去的区间。
所以从前向后更新就好了,dp[ i ] 表示删到第 i 个数时的最大值,j 枚举前面一起删去的区间长度。
代码如下qwq。
#include <cstdio> #include <algorithm> using namespace std; int n, val[105], dp[105]; inline int Val(int l, int r) { return abs(val[l] - val[r]) * (r - l + 1); } int main(int argc, char const *argv[]) { // freopen("nanjolno.in", "r", stdin); // freopen("nanjolno.out", "w", stdout); scanf("%d", &n); for(int i = 1; i <= n; ++i) scanf("%d", &val[i]); for(int i = 1; i <= n; ++i) { dp[i] = max(dp[i], dp[i - 1] + val[i]); for(int j = 2; j <= i; ++j) dp[i] = max(dp[i], dp[i - j] + Val(i - j + 1, i)); } printf("%d\n", dp[n]); // fclose(stdin), fclose(stdout); return 0; }
- 1
信息
- ID
- 1452
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者