题面:

$ 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. hexo搭建

    http://blog.csdn.net/gdutxiaoxu/article/details/53576018

  2. LeetCode 638 Shopping Offers

    题目链接: LeetCode 638 Shopping Offers 题解 dynamic programing 需要用到进制转换来表示状态,或者可以直接用一个vector来保存状态. 代码 1.未优 ...

  3. [转帖]QEMU和QEMU-KVM的关系

    QEMU和QEMU-KVM的关系 https://blog.csdn.net/shengxia1999/article/details/52244119   版权声明:本文为博主原创文章,未经博主允许 ...

  4. 【菜鸟】RESTful 架构详解

    RESTful 架构详解 分类 编程技术 1. 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次 ...

  5. Linux 备份 文件夹的权限 然后在其他机器进行恢复

    Study From https://www.cnblogs.com/chenshoubiao/p/4780987.html 用到的命令 getfacl 和 setfacl 备份 getfacl -R ...

  6. Java对中文进行排序

    对中文进行排序,同样是得定义一个Comparator,下面上代码: import java.text.Collator; import java.util.ArrayList; import java ...

  7. 一本通1646GT 考试

    1646:GT 考试 时间限制: 1000 ms         内存限制: 524288 KB [题目描述] 阿申准备报名参加 GT 考试,准考证号为 n 位数 X1X2⋯Xn(0≤Xi≤9),他不 ...

  8. 一本通1628X-factor Chain

    1628:X-factor Chain 时间限制: 1000 ms         内存限制: 524288 KB [题目描述] 原题来自 POJ 3421 输入正整数 x,求 x 的大于 1 的因子 ...

  9. in packet sniffer

    in packet sniffer 来源 https://kb.fortinet.com/kb/microsites/search.do?cmd=displayKC&docType=kc&am ...

  10. c# 新建文本文件、遍历读取文本、删除文本行

    如果该物理路径没有该文本则创建一个新文本 if (!File.Exists(@"C:\db.txt")){FileStream fs = new FileStream(@" ...