评测传送门

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

  每个产品有一个制作时间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. http和https的优缺点,区别与工作原理

    文章内容 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可 ...

  2. RHEL/Centos下VSFTPD服务器搭建

    目的 Linux下安装配置vsfptd服务器,并通过客户端验证. 环境 Centos 6 局域网 内容 配置Vsftpd服务器:实现匿名用户.本地用户和虚拟用户登录的配置.匿名用户可以上载文件,上载后 ...

  3. css中定位功能的特性

    它有四大特性,页面找不到盒子的情况 1.z-index值表示谁压着谁,数值大的压盖数值小的 2.只有定位了的元素,才有z-index.也就是说,不管相对定位,绝对定位,固定定位,都可以使用z-inde ...

  4. wai

    外键的过滤是怎么做的, 一个class有两个外键A和B,其中A又是B的外键,在这种情况下,比如A选择了学校之后,可否在B中过滤出A学校的所有的专业?也就是说在选择的时候能不能按照已经填好的一个选项来选 ...

  5. input select & input unselect

    input select & input unselect input select https://developer.mozilla.org/en-US/docs/Web/API/HTML ...

  6. Delphi开发单机瘦数据库程序要点(后缀cds)

    一.概述 Delphi作为Windows下的一种快速开发工具,不仅能开发一般的Windows应用程序,而且还具有强大的数据库应用程序开发功能.Delphi本身提供了对BDE,ODBC,ADO和Inte ...

  7. delphi adoquery的post和UpdateBatch

    delphi adoquery的post和UpdateBatch Post是确认当前的修改,而UpdateBatch是把已经确认但是没有存盘的数据写入数据库当ADOQuery的CursorType是c ...

  8. topcoder srm 738 div1 FindThePerfectTriangle(枚举)

    Problem Statement      You are given the ints perimeter and area. Your task is to find a triangle wi ...

  9. Next Permutation - LeetCode

    目录 题目链接 注意点 解法 小结 题目链接 Next Permutation - LeetCode 注意点 如果是字典序最大的串则要返回字典序最小的串 解法 解法一:参见:http://www.cn ...

  10. CF662C Binary Table 【状压 + FWT】

    题目链接 CF662C 题解 行比较少,容易想到将每一列的状态压缩 在行操作固定的情况下,容易发现每一列的操作就是翻转\(0\)和\(1\),要取最小方案,方案唯一 所以我们只需求出每一种操作的答案 ...