经典的拆绝对值

题目大意

给定$n$个具有顺序的序列,允许对每个序列循环移动。记第$i$个序列尾元素为$x$,$i+1$个序列首元素为$y$,定义其连接收益为$|x-y|*i$,求$n$个序列连接最大收益。

$\sum n \le 10^6$


题目分析

经典dp做得少

考虑如何处理绝对值:绝对值按分类讨论分开无非就两种情况$x*i-y*i$或者$y*i-x*i$,并且两者异号,相当于转为$\max$的问题。

因而不需要管两个元素的相对大小,只需要记录元素$a_v$的$\max\{f_{a_v}-a_v*i\}$和$\max\{f_{a_v}+a_v*i\}$.转移时候两者分开。

意会一下就是如下图

  1. #include<bits/stdc++.h>
  2. typedef long long ll;
  3. const ll INF = 1ll<<;
  4. const int maxn = ;
  5.  
  6. int T,n,len[maxn],id[maxn];
  7. ll f[maxn],ans,pre,suf;
  8. std::vector<int> a[maxn];
  9.  
  10. int read()
  11. {
  12. char ch = getchar();
  13. int num = , fl = ;
  14. for (; !isdigit(ch); ch=getchar())
  15. if (ch=='-') fl = -;
  16. for (; isdigit(ch); ch=getchar())
  17. num = (num<<)+(num<<)+ch-;
  18. return num*fl;
  19. }
  20. int main()
  21. {
  22. for (T=read(); T; --T)
  23. {
  24. n = read(), id[] = ;
  25. for (int i=; i<=n; i++)
  26. {
  27. a[i].clear(), len[i] = read(), id[i] = id[i-]+len[i-];
  28. for (int j=; j<=len[i]; j++)
  29. a[i].push_back(read());
  30. }
  31. ans = pre = suf = ;
  32. for (int i=; i<=n; i++)
  33. {
  34. ll nxtp = -INF, nxts = , val = ;
  35. for (int j=,mx=a[i].size(),lst; j<mx; j++)
  36. {
  37. lst = j?(j-):a[i].size()-;
  38. val = std::max(pre+1ll*a[i][j]*(i-), suf-1ll*a[i][j]*(i-));
  39. ans = std::max(ans, val);
  40. nxtp = std::max(nxtp, val-1ll*a[i][lst]*i);
  41. nxts = std::max(nxts, val+1ll*a[i][lst]*i);
  42. }
  43. pre = nxtp, suf = nxts;
  44. }
  45. printf("%lld\n",ans);
  46. }
  47. return ;
  48. }

END

【经典dp 技巧】8.13序列的更多相关文章

  1. HDU 1003 Max Sum --- 经典DP

    HDU 1003    相关链接   HDU 1231题解 题目大意:给定序列个数n及n个数,求该序列的最大连续子序列的和,要求输出最大连续子序列的和以及子序列的首位位置 解题思路:经典DP,可以定义 ...

  2. NYOJ - 矩形嵌套(经典dp)

    矩形嵌套时间限制:3000 ms | 内存限制:65535 KB 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b< ...

  3. [文文殿下]基本的DP技巧

    . 二进制状态压缩动态规划 对于某些情况,如果题目中所给的限制数目比较小,我们可以尝试状态压缩动态规划.例如,题目中给出数据范围\(n<=20\),这个一般情况下是一个状压DP的提示. 状态压缩 ...

  4. poj1458 求最长公共子序列 经典DP

    Common Subsequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 45763   Accepted: 18 ...

  5. P1091 合唱队形 DP 最长升序列维护

    题目描述 NN位同学站成一排,音乐老师要请其中的(N-KN−K)位同学出列,使得剩下的KK位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2,…,K1,2,…,K,他 ...

  6. 51nod 1412 AVL树的种类(经典dp)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1412 题意: 思路: 经典dp!!!可惜我想不到!! $dp[i][k] ...

  7. NYOJ 16 矩形嵌套(经典DP)

    http://acm.nyist.net/JudgeOnline/problem.php?pid=16 矩形嵌套 时间限制:3000 ms  |           内存限制:65535 KB 难度: ...

  8. poj 1050 To the Max 最大子矩阵和 经典dp

    To the Max   Description Given a two-dimensional array of positive and negative integers, a sub-rect ...

  9. CS Academy Distinct Neighbours(经典dp)

    CS Academy Distinct Neighbours(经典dp) 题意: 求相邻无相同数字的合法的排列数 题解: 题解 先将相同的数字分为一类,假设共有n组 定义\(dp[i][j]\)表示前 ...

随机推荐

  1. 如何使用thymeleaf显示控制传递过来的数据

    实例 <p th:text="'Hello, ' + ${name} + '!'" /> name为要显示的参数名

  2. Kubernetes---Pod hook

    Pod hook(钩子)是由Kubernetes管理的kubelet发起的,当容器中的进程启动前或者容器中的进程终止之前运行,这是包含在容器的生命周期之中.可以同时为Pod中的所有容器都配置 hook ...

  3. J.U.C之AQS介绍

    从JDK1.5开始,引入了并发包java.util.concurrent(J.U.C),并发容器里的同步容器AQS(AbstractQueuedSynchronizer)是J.U.C的核心,AQS底层 ...

  4. Python 运算符与数据类型

    Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...

  5. 怎样快捷获取元素节点body

    1. 使用: document.body document.body.nodeName; // "BODY" 2. 使用: document.getElementsByTagNam ...

  6. 怎样获取不同环境下的document对象

    1. 在一般的网页文档中, 可通过: document 或 window.document 获取; 2. 在iframe框架中, 可通过iframe节点的属性: contentDocument 获取; ...

  7. Python 字符串——巧取值和列表——巧取值 对比

    Python 字符串——巧取值和列表——巧取值 对比 1.字符串取值实例: samp_string = "Whatever you are, be a good one." for ...

  8. promise, async和await

    最开始实现异步的方法:回调函数 method1(function(err, result) { if (err) { throw err; } method2(function(err, result ...

  9. 【原创】大叔经验分享(80)openresty(nginx+lua)发邮件

    nginx配置 lua_package_path "/usr/local/openresty/lualib/resty/smtp/?.lua;;"; lua_need_reques ...

  10. 启动tomcat提示某个端口被占用

    原文参见:https://www.cnblogs.com/liuyanxia/p/6755520.html 解决办法 找出占用1099端口的进程,进入windows命令,查看什么进程占用了1099端口 ...