题面:

$ solution: $

又是一道 $ DP $ 的好题啊!状态并不明显,需要仔细分析,而且还结合了栈的特性!

做这一类题,只要出题人有点理想,一定会在栈的性质上做点文章,所以我们尽量围绕栈的性质设置 $ DP $ 状态。可是栈又有什么性质呢?讲真,考场我是真没想到,好像压根就不知道有这个特性:

对于队列里 $ [l,r] $ 范围内的数,必然存在一个最晚出栈的 $ i\in[l,r] $ ,而我们不难发现此时 $ [l,i-1] $ 必然比 $ [i+1,r] $ 出栈要早一些,因为 $ [i+1,r] $ 进栈之前 $ i $ 就已经进栈了,而 $ i $ 又是最后一个出栈的(也就是说在 $ i $ 进栈时栈里一定是空的!!!不然:假设还有一个 $ j $ 未弹出, $ i $ 进栈时会在 $ j上面 $ ,那么最晚出栈的就将会是 $ j $ !!!)

所以不论 $ [l,i-1] $ 的顺序是怎样的,他们对于后面的数所产生的(时间之和)与(惩罚值之和)是确定的!!!而此时如果我们知道 $ [l,i-1],[i+1,r] $ 的总(时间之和)与(惩罚值之和)就能知道 $ [l,r] $ 的总(时间之和)与(惩罚值之和)。所以我们应该先用这个方法先求 $ [l,i-1] $ 与 $ [i+1,r] $ 的最小(时间之和)与(惩罚值之和)再来得出 $ [l,r] $ 。

转移方程:

$ f[l][r]=min(f[l][r],f[l][i-1]+f[i+1][r]+(st[i-1]-st[l-1])\times (sd[r]-sd[i])+(st[r]-st[l-1])\times d[i]) $

其中:

  1. $ i $ 是需要在 $ [l,r] $ 内枚举的
  2. $ f[l][i-1] $ 与 $ f[i+1][r] $ 是先前就求好了的
  3. $ (st[i-1]-st[l-1])\times (sd[r]-sd[i]) $ :这个是因为 $ [i+1,r] $ 在 $ [l,i-1] $ 后面,所以等待的时间增加了 $ ([l,i-1] $ 的时间总和,从而总惩罚值也要相应增加。
  4. $ (st[r]-st[l-1])\times d[i]) $ : $ i $ 是最后一个出栈的,它的惩罚值要乘上整个区间的时间和

唉!现在一想明明如此浅显的道理我怎么在考场上就是想不到呢???果然还是太弱了,唉.........

$ code: $

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set> #define ll long long
#define db double
#define inf (ll)40000000001
#define rg register int using namespace std; int n;
int t[205];
int d[205];
ll st[205];
ll sd[205];
ll f[205][205]; inline int qr(){
char ch;
while((ch=getchar())<'0'||ch>'9');
int res=ch^48;
while((ch=getchar())>='0'&&ch<='9')
res=res*10+(ch^48);
return res;
} int main(){
//freopen("product.in","r",stdin);
//freopen("product.out","w",stdout);
n=qr();
for(rg i=1;i<=n;++i){
t[i]=qr(),d[i]=qr();
st[i]=st[i-1]+t[i];
sd[i]=sd[i-1]+d[i];
}
for(rg i=1;i<=n;++i)
for(rg j=i;j<=n;++j)
f[i][j]=i==j?t[i]*d[i]:inf;
for(rg k=1;k<=n;++k)
for(rg l=1;l<=n-k;++l)
for(rg i=l,r=l+k;i<=r;++i)
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]);
printf("%lld\n",f[1][n]);
return 0;
}

产品排序(2015 年北大自招夏令营) (与栈相关的区间DP)的更多相关文章

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

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

  2. 2015暑假多校联合---Expression(区间DP)

    题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=5396 Problem Description Teacher Mai has n numb ...

  3. 产品排序 product

    评测传送门 [问题描述] 你是一个公司的员工,你会按时间顺序受到一些产品的订单,你需要用一个栈来改变这些订单的顺序(每个产品都必须入栈和出栈一次). 按初始顺序,每次可以将一个产品入栈,或将栈顶产品弹 ...

  4. 编程之美2015资格赛 题目2 : 回文字符序列 [ 区间dp ]

    传送门 题目2 : 回文字符序列 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定字符串,求它的回文子序列个数.回文子序列反转字符顺序后仍然与原序列相同.例如字符串ab ...

  5. [算法]美团春招笔试题C-求有趣子序列数(DP)

    题目 输入n,以及长度为n的数组元素 输出数组的非空子序列中有多少个"有趣序列"mod 998244353,有趣序列指所有元素满足arr[i]%i == 0, i从0记. 例: 输 ...

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

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

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

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

  8. 上海洋码头(www.ymatou.com)急招技术人才(职位:互联网软件开发工程师,.NET网站架构师,Web前端开发工程师,高级测试工程师,产品经理)

    对公司招聘职位有兴趣的童鞋可以把简历发送到zhangzhiqiang@ymatou.com,我们HR会快速给你答复. 互联网软件开发工程师 岗位职责: 1.参与洋码头各个平台(www.ymatou.c ...

  9. 北大 ACM 分类 汇总

    1.搜索 //回溯 2.DP(动态规划) 3.贪心 北大ACM题分类2009-01-27 1 4.图论 //Dijkstra.最小生成树.网络流 5.数论 //解模线性方程 6.计算几何 //凸壳.同 ...

随机推荐

  1. 学习笔记 | CDQ分治

    目录 前言 啥是CDQ啊(它的基本思想) 例题 后记 参考博文 前言 博主太菜了 学习快一年的OI了 好像没有什么会的算法 更寒碜的是 学一样还不精一样TAT 如有什么错误请各位路过的大佬指出啊感谢! ...

  2. vue入门全局配置

    全局配置 Vue.config 是一个对象,包含 Vue 的全局配置.可以在启动应用之前修改下列属性: silent 类型:boolean 默认值:false 用法: Vue.config.silen ...

  3. android开发之使用SQLite数据库存储

    http://blog.csdn.net/jason0539/article/details/16360835 SQLite 介绍 SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且 ...

  4. alpha发布排序结果

    友组所做排序 其中有一组是教师排序. 序号 组名 组长 项目简称 匿名1组 匿名2组 匿名3组 匿名4组 匿名5组 匿名6组 匿名7组 匿名8组 平均 1 新蜂 武志远 俄罗斯 2 3 3 4 4 5 ...

  5. ajax设置自定义请求头

    1, $.ajax({ url:apiUrl, type:"get", timeout : 5000, //超时时间设置,单位毫秒 dataType: "json&quo ...

  6. Spring学习总结之面向切面(AOP)

    AOP术语 通知(advice):定义切面是什么以及什么时候使用 连接点(join point):应用在执行过程中能够插入切面的点 切点(pointcut):切点的定义会匹配通知所要织入的一个或多个连 ...

  7. Linux内核分析:完成一个简单的时间片轮转多道程序内核代码

    PS.贺邦   原创作品转载请注明出处  <Linux内核分析>MOOC课程    http://mooc.study.163.com/course/USTC-1000029000 1.m ...

  8. c# dataGridView 表头格式设置不管用

    解决办法: EnableHeaderVisualStyles设为false

  9. [转帖]MerkleDAG全面解析 一文读懂什么是默克尔有向无环图

    MerkleDAG全面解析 一文读懂什么是默克尔有向无环图 2018-08-16 15:58区块链/技术 MerkleDAG作为IPFS的核心数据结构,它融合了Merkle Tree和DAG的优点,今 ...

  10. 导入appiumlibrary显红

    1.点击ride中的Tools的View RIDE Log 2.打开日志报如下错误,提示没有six这个模块,可能是最新包的要对python版本兼容 3.所以使用pip install six安装包后 ...