题目链接

Solution

用传统的思想考虑正推,发现后面的答案依赖于当前的 \(p\),你不但要记录前 \(i\) 个还要记录 \(p\),显然空间爆炸。

类似 AcWing 300. 任务安排1,不妨考虑每次操作对后面整体的影响:

  • 如果你采矿,之后的所有操作代价都会变为原来的 \(1 - 0.01k\)。(因为所有操作代价都是 \(p\) 的乘积,并且你改变了 \(p\))。
  • 如果你维修,之后所有操作代价都会变为原来的 \(1 + 0.01c\)。

不妨初始假设在每个位置时,\(p\) 都还是初始的 \(w\),很明显从后向前推,不再具有后效性。

状态定义

设 \(f_i\) 表示 \(i\) ~ \(n\) 的最大收入。

状态转移

  • 什么也不做 \(f_i \gets f_{i + 1}\)
  • 如果这个星球是资源型,可以开采,代价变换:\(f_i \gets w · a_i + (1 - 0.01k)f_{i+1}\)
  • 如果这个星球是维修型,类似的:\(f_i \gets - w·b_i + (1 + 0.01c)f_{i+1}\)

Code

#include <iostream>
#include <cstdio> using namespace std; const int N = 100005; int n, K, C, W, t[N], v[N];
double f[N]; int main() {
scanf("%d%d%d%d", &n, &K, &C, &W);
for (int i = 1; i <= n; i++) scanf("%d%d", t + i, v + i);
for (int i = n; i; i--) {
if (t[i] == 1) f[i] = max(f[i + 1], v[i] * W + (1 - 0.01 * K) * f[i + 1]);
else f[i] = max(f[i + 1], -v[i] * W + (1 + 0.01 * C) * f[i + 1]);
}
printf("%.2lf\n", f[1]);
return 0;
}

最新文章

  1. 初涉定制linux系统之——自动化安装Centos系统镜像制作
  2. uva111动态规划之最长公共子序列
  3. CentOS 6.5下Git服务器搭建
  4. dom 表格操作
  5. 安装ipython notebook
  6. IIS 64位上發佈32位asp.net設置
  7. [js高手之路] html5 canvas系列教程 - arcTo(弧度与二次,三次贝塞尔曲线以及在线工具)
  8. 漫谈程序员(十二)IT程序猿之猿体是革命的本钱
  9. 心路历程:当win10遇上win7激活程序...请默哀
  10. 根据class判断
  11. leetcode(js)算法605之种花问题
  12. 20165206 实验一 Java开发环境的熟悉
  13. ElasticSearch 评分排序
  14. Jquery EasyUI Combotree只能选择叶子节点且叶子节点有多选框
  15. cstdlib和stdlib.h区别
  16. 类变量的初始化时机(摘录自java突破程序员基本功德16课)
  17. Odoo进销存(采购、销售、仓库)入门教程 - 下
  18. 12月16日 增加一个购物车内product数量的功能, 自定义method,在helper中定义,计算代码Refactor到Model中。
  19. [EXCEL] 不能清除剪贴板: We couldn&#39;t free up space on the clipboard. Another program might be using it right now
  20. jsp标签在JavaScript中使用时,可能会出现的一个问题。

热门文章

  1. PF_PACKET抓包mmap
  2. spring mvc 基础知识
  3. 解决SSH显示中文乱码的问题(cent os7)
  4. spring cloud 入门系列
  5. Python_面试题汇总【正在整理中...】
  6. rootfs如何取消登录超时
  7. Linux Command Line_1_Shell基础
  8. 1、Go语言介绍
  9. yii2.0 删除文件夹
  10. 第四章:动态规划I