评测传送门

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

  每个产品有一个制作时间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. display:flex 布局教程,弹性布局!

    display:flex 布局教程 布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现. ...

  2. javascript 容易忘记方法集锦

    定义和用法 1.split() 方法用于把一个字符串分割成字符串数组. 提示: 如果把空字符串 ("") 用作 separator,那么 stringObject 中的每个字符之间 ...

  3. apache +PHP多版本 切换的问题

    在开发中切换php版本的时候出错 经过2小时的日子排查终于找到是因为切换版本后加载的php7ts.dll模块还是原来版本的,因此保pid file 错误 解决方法 PHPIniDir "H: ...

  4. div内元素的居中

    1.如果是一行文字(不超过一行) parent{ text-align:center; line-height:div高度; } 2.如果是div内其他类型元素 parent{ height:xxxp ...

  5. D-Separation(D分离)-PRML-8.22-Graphical Model 五 18 by 小军

    D-Separation(D分离)-PRML-8.22-Graphical Model 五18by 小军   一.引言 在贝叶斯网络的学习过程中,经常会遇到(D-Separation)D-分离这个概念 ...

  6. P1198 [JSOI2008]最大数

    题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:L不超过当前数列的长度.(L>0) ...

  7. Timing wheel心跳机制

    在web服务中,断开空闲连接是一种减少资源浪费的一种手段,由此就有了心跳机制来判断一个连接是否空闲. 一种简单粗暴的方式: 1. 服务端每个连接保存一个最后一次操作的时间戳,每次这个连接对应fd可读时 ...

  8. 20135239 益西拉姆 linux内核分析 可执行程序的装载

    益西拉姆 + 原创作品请勿转载 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ” week 7 可 ...

  9. 最新版的Android4.4.2 SDK无法下载解决

    http://hi.baidu.com/petercao2008/item/65362d2bdbddfacba5275a50 问题: Downloading ARM EABI v7a System I ...

  10. 解题:USACO10MAR Great Cow Gather

    题面 可以水水换根的,不过我是另一种做法:(按点权)找重心,事实上这是重心的一个性质 考虑换根的这个过程,当我们把点放在重心时,我们移动这个点有两种情况: 1.移动到最大的那个子树里 可以发现这个最大 ...