评测传送门

【问题描述】
  你是一个公司的员工,你会按时间顺序受到一些产品的订单,你需要用一个栈来改变这些订单的顺序(每个产品都必须入栈和出栈一次)。
  按初始顺序,每次可以将一个产品入栈,或将栈顶产品弹至现在的序列末尾。

  每个产品有一个制作时间t i 和单位时间惩罚值d i 。

  总的惩罚值为∑ ni=1 (s i × d i ),其中s i 为第i个产品的完成时间,你需要最小化总的惩罚值。
【输入】
  输入文件 product.in。
  第一行一个数n,表示产品个数。
  接下来n行,每行两个数表示t i , d i 。
输出】
  输出文件 product.out。
  一行一个数表示最小的总惩罚值。

【样例输入】

  4

  1 4

  3 2

  5 2

  2 1

【样例输出】

  40

【数据范围】

  30%: n ≤ 15
  50%: n ≤ 100
  100%: n ≤ 200, t i , d i ≤ 1000

正解:

  f[l][r] : 标号 l~r 的最小惩罚值 (时间上以开始生产[ l , r ]的产品为起始)

  < st[ ] 为时间前缀和 sd[ ] 为单位时间惩罚值前缀和>

  在[l,r] 中枚举 i , i 为 [l,r]中最后一个出栈的元素 即栈中最后一个元素

  f[l][r]=min(f[l][r],f[l][i-1]+f[i+1][r]+(st[i-1]-st[l-1])*(sd[r]-sd[i])+(st[r]-st[l-1])*d[i]);

  这个转移方程式我真的想了差不多十分钟才看懂

  如下:(一定要仔细,耐心理解 qwq)

  i 为最后一个出栈的元素 所以 l ~ i-1 一定在 i 进栈前就出栈了(否则它们现在就还在栈中)

  f[l][i-1] 和 f[i+1][r] 都只与它们内部的顺序以及 [ l , i ]的总时间有关

  是两个互不相关的子问题

  (st[r]-st[l-1])*d[i]) 是 i 的惩罚值 很好理解

  (st[i-1]-st[l-1])*(sd[r]-sd[i]) 我觉得是一个很巧妙的地方啊

  我觉得我现在说不清楚 要自己领会一下qwq

  但是我还是要大概说一下<这里用记忆化搜索实现的>

      是加法结合律的逆向运用

      然后保证了计算f[i+1][r]的时间是包括[l,r]中比它们先出去的产品的完成时间的

      至于内部的顺序问题 又到下一层函数解决了

      层层递归

 CODE

 #include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; #define LY(p) freopen (p".in", "r", stdin); freopen (p".out", "w", stdout)
#define LL long long
#define dbl double
#define lf long double
#ifdef WIN32
#define L_L "%I64d"
#else
#define L_L "%lld"
#endif
#define N 210
int n, t[N], d[N], st[N], sd[N];
LL f[N][N]; int main()
{
scanf ("%d", &n);
for (int i = ; i <= n; i++) {
scanf ("%d %d", &t[i], &d[i]);
st[i] = st[i - ] + t[i];
sd[i] = sd[i - ] + d[i];
} memset (f, 0x3f, sizeof (f));
for (int i = ; i <= n; i++)
f[i][i] = d[i] * t[i], f[i][i - ] = ;
f[n + ][n] = ; for (int l = ; l < n; l++)
for (int i = ; i + l <= n; i++)
{
int j = i + l;
for (int k = i; k <= j; k++)
f[i][j] = min
(f[i][k - ] + f[k + ][j] + 1LL * (st[k - ] - st[i - ]) * (sd[j] - sd[k]) + 1LL * (st[j] - st[i - ]) * d[k], f[i][j]);
} printf (L_L, f[][n]);
return ;
}

std 非记搜

 #include<iostream>
#include<cstdio>
#define go(i,a,b) for(register int i=a;i<=b;i++)
#define ll long long
#define M 201
#define inf 21000000000000
using namespace std;
ll read()
{
int x=,y=;char c=getchar();
while(c<''||c>'') {if(c=='-') y=-;c=getchar();}
while(c>=''&&c<='') {x=(x<<)+(x<<)+c-'';c=getchar();}
return x*y;
}
ll n,t[M],d[M],st[M],sd[M],f[M][M];
ll dfs(int l,int r)
{
if(l>r) return ;
if(l==r) return t[l]*d[l];
if(f[l][r]) return f[l][r];
f[l][r]=inf;
go(i,l,r)
f[l][r]=min(f[l][r],dfs(l,i-)+dfs(i+,r)+(st[r]-st[l-])*d[i]+(st[i-]-st[l-])*(sd[r]-sd[i]));
return f[l][r];
}
int main()
{
n=read();
go(i,,n)
{
t[i]=read();st[i]=st[i-]+t[i];
d[i]=read();sd[i]=sd[i-]+d[i];
}
printf("%lld",dfs(,n));
return ;
}

dtt 记搜

产品排序 product的更多相关文章

  1. 洛谷P1654 产品排序(sort)

    P1654 产品排序(sort) 题目描述 有一系列产品,给定每个产品的加工时间和冷却成型时间(冷却过程产品之间没有关系,是单独冷却的).现在你手上有两台机器可以用来加工,你需要安排产品加工的顺序以及 ...

  2. 结构性产品 Structured Product

    定义 结构性产品是固定收益产品(Fixed Income Instruments)的一个特殊种类.它将固定收益产品(通常是定息债券)与金融衍生交易(如远期.期权.掉期等)合二为一,增强产品收益或将投资 ...

  3. 产品排序(2015 年北大自招夏令营) (与栈相关的区间DP)

    题面: \(solution:\) 又是一道\(DP\)的好题啊!状态并不明显,需要仔细分析,而且还结合了栈的特性! 做这一类题,只要出题人有点理想,一定会在栈的性质上做点文章,所以我们尽量围绕栈的性 ...

  4. magento 产品列表排序、分页功能

    我们以 catalog_category_layered 控制器为例说明 在catalog.xml 找到catalog_category_layered配置段 <catalog_category ...

  5. Woocommerce 分类下的产品如何使用ID号来作为默认排序字段

    在给一个客户开发网店系统时使用了WordPress系统的Woocommerce插件 WordPress版本:3.8 Woocommerce版本:2.0.20 如果没有指定排序规则(指定的字段),则Wo ...

  6. 实战_3:新建产品配置(product)并导出项目

    产品配置Product 产品配置用于定义和管理RCP应用的多个方面特征.并支持将RCP项目导出为部署包(类似eclipse压缩包),可以直接部署到其他环境上使用. 产品配置必须新建一个 扩展名为 .p ...

  7. 什么是产品待办列表?(What is Product Backlog)

    正如scrum指南中所描述的,产品待办事项列表是一个紧急而有序的列表,其中列出了改进产品所需的内容.它是scrum团队承担的工作的唯一来源. 在sprint计划 (Sprint Planning)活动 ...

  8. Magento创建configurable产品的要点

    接着上一篇用API创建可配置的产品Configurable Product说事.Magento的产品类型可分为Simple Product.Group Product.Configurable Pro ...

  9. 【iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!【2012-12-11日更新获取”产品付费数量等于0的问题”】

    转的别人的 看到很多童鞋问到,为什么每次都返回数量等于0?? 其实有童鞋已经找到原因了,原因是你在 ItunesConnect 里的 “Contracts, Tax, and Banking”没有完成 ...

随机推荐

  1. Java线程池(一):初识

    1.什么是线程池? 简单粗暴的理解就是:装着一个或多个线程的容器,我们称这个容器为线程池. 在现实世界中,有着各种各样的“池”,例如游泳池.花池等等.那花池来说,里面种满了各种各样的鲜花,花池本身要做 ...

  2. Spring Cloud与微服务构建:微服务简介

    Spring Cloud与微服务构建:微服务简介 单体架构及其不足 1.单体架构简介 在软件设计中,经常提及和使用经典的3曾模型,即表示层.业务逻辑层和数据访问层. 表示层:用于直接和用户交互,也成为 ...

  3. BZOJ3439 Kpm的MC密码(可持久化trie)

    将串反过来就变成查询前缀了.考虑建一棵可持久化trie,查询时二分答案,均摊一下复杂度即为O(mlogn). #include<iostream> #include<cstdio&g ...

  4. Executors提供的四种线程池和自定义线程池

    JAVA并发编程——EXECUTORS 线程池的思想是一种对象池的思想,开放一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理.当有线程任务时,从池中取一个,执行完毕,对象 ...

  5. C++接口继承与实现继承的区别和选择

    1.接口继承与实现继承的区别 <Effective C++>条款三十四:区分接口继承和实现继承中介绍的比较啰嗦,概括地说需要理解三点: (1)纯虚函数只提供接口继承,但可以被实现: (2) ...

  6. 单点登录(八)-----遇到问题-----Application Not Authorized to Use CAS

    配置好cas后访问cas  client 并没有跳转到登录页面,而是页面报错误提示: Application Not Authorized to Use CAS. The application yo ...

  7. python抓取

    我要抓取奥巴马每周的演讲内容http://www.putclub.com/html/radio/VOA/presidentspeech/index.html 如果手动提取,就需要一个个点进去,再复制保 ...

  8. 【Asp.net入门3-03】jQuery-选择元素

    练习:使用jQuery实现一个可以给table增加.删除行的页面 HTML代码: <body> <input type="button" value=" ...

  9. ubunto 16.04 lts 源

    http://601502546.blog.163.com/blog/static/2596107620171502517889 国内有很多ubuntu的源,包括:网易源(这个之前用过,速度很快的), ...

  10. GO_07:GO语言基础之method

    方法 method 1. Go 中虽没有 class,但依旧有 method 2. 通过显示说明 receiver 来实现与某个类型的组合 3. 只能为同一个包中的类型定义方法 4. Receiver ...