1 条题解

  • 0
    @ 2025-8-24 21:37:35

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 柒命九陨_
    **

    搬运于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
    上传者