链接:Wannafly挑战赛21:C - 大水题

题意:

现在给你N个正整数ai,每个数给出一“好数程度” gi(数值相同但位置不同的数之间可能有不同的好数程度)。对于在 i 位置的数,如果有一在j位置的数满足 j < i 且 ai=aj,则你可以将位于[i,j]闭区间内的序列评为“好序列”,然后获得∑gk(j≤k≤i)(此闭区间内“好数程度”之和)分数。

注意: 在所有情况下,每个数都只能被一个”好序列”包含(只能与其他相应数被评为”好序列”一次);在符合要求的情况下,”好序列”的评定次数不受限制,且通过不同”好序列”获得的分数可以累加。

题解:

sum[i] :前缀和。

dp[i] :当前最优解。

mp[a[i]] :假设 a[i] 在第 k 的位置,x 是前 k - 1 个数损失的最小值(即不能取的数的和的最小值),mp[a[i]] 就是前面出现的所有 a[i] 中 x 最小的那个 x。

那么就可进行状态转移:dp[i] = max(dp[i-1], sum[i] - mp[a[i]]) 。

注意如果前面没出现过 a[i] ,那么 mp[a[i]] = INF 。

#include <bits/stdc++.h>
using namespace std; const long long INF = 1LL << ;
const int maxn = + ;
int n;
long long a[maxn], g[maxn];
long long dp[maxn], sum[maxn];
map<long long, long long> mp; int main()
{
scanf("%d", &n);
for(int i = ; i <= n; i++) scanf("%lld", &a[i]);
for(int i = ; i <= n; i++) scanf("%lld", &g[i]), sum[i] = sum[i-] + g[i]; for(int i = ; i <= n; i++){
if(!mp.count(a[i])) mp[a[i]] = INF;
dp[i] = max(dp[i-], sum[i] - mp[a[i]]);
mp[a[i]] = min(mp[a[i]], sum[i-] - dp[i-]);
} printf("%lld\n", dp[n]); return ;
}

最新文章

  1. linux下利用GPRS模块发短信、打电话
  2. 强联通 poj 2762
  3. ueditor在使用requirejs时,报ZeroClipboard undefined错误
  4. c#读取文本文档实践3-写入到文本本文档
  5. Unix/Linux中shell调用sqlplus的方式
  6. 关于Eigen库在Visual Studio2013中传参对齐报错问题
  7. hdu 4452
  8. 配置处理结果result
  9. DTD
  10. HTML学习笔记 基础表格案例 第二节 (原创) 参考使用表
  11. Vue-zTree
  12. mysql表与表之间数据的转移
  13. 痞子衡嵌入式:通用NOR接口标准(CFI-JESD68)及SLC Parallel NOR简介
  14. 爬虫工程师JD归纳
  15. 零基础IDEA整合SpringBoot + Mybatis项目,及常见问题详细解答
  16. shell 中的单行注释和多行注释
  17. Beaglebone板子修改usb连接时的默认IP192.168.0.2
  18. POJ-3107 Godfather 求每个节点连接的联通块数量
  19. Andrew Ng机器学习课程笔记(一)之线性回归
  20. Asp.net Ajax(ashx)

热门文章

  1. linux命令进阶及和windows进行文件传输的所有方式
  2. [Oracle]Oracle表权限小结
  3. vue+nodejs+express+mysql 建立一个在线网盘程序
  4. D - 湫湫系列故事——减肥记II
  5. 通过xshell在linux上安装tomcat8
  6. 微信小程序navigator无法跳转情况
  7. Docker运行Nginx服务器
  8. dom4j解析器sax解析xml文件
  9. C++常量(const)的使用
  10. idea 普通文件夹 转换成 module