You Are The One

题意:有n个人准备按顺序上台,上台前有个小黑屋(先进后出,即栈),可以被安排进去等待,也可以直接上台,一个人一旦被安排进去,后面的人就可以先上台(小黑屋无限大)。每个人有一个愤怒值angry,如果他是第k个上台的,那么他的怒气和就是(k-1)*angry,如何运用小黑屋安排上台顺序,使得这n个人的怒气总和最小。

思路:这是一道区间dp题(这几天做的都是区间dp的专题,不是就见鬼了),状态很容易想到,用f[l][r],表示l~rr-l+1个人的最小怒气总和,那么如何转移,其实区间dp大概的套路也就是三个for( for len ; for l,r ; for k (l,r) ),而这题其中的小细节也比较容易观察到,那么问题来了,这也是为什么这题区间dp拿来写的原因,一般的k枚举都是lr来划分区间,但是这题显然没有什么用,为什么没用?因为要用小黑屋啊!如果直接枚举断点,而这题的l, r点是没什么关系的(如果真的有,个人感觉也很难推出,因为每个人的出场顺序其实是不一定的),怎么算出最优?(不用小黑屋也可以看做进去马上出来,问题不大),那么考虑到一个问题,既然出场顺序不一定,那k就枚举出场顺序吧,显然区间l~r的一个人出场顺序就只有r-l+1种,因为如果只有len个人,怎么做到第len+1出场?(一场跑步比赛,你超越了最后一名,你是第几!),至此,转移的for考虑完了,那么这个k来枚举谁呢?第一个?最后一个?随便一个?其实,随便一个都可以,因为最后区间最优,其实顺序是定的,所以先枚举谁都可以,那么就枚举这个区间的第一个吧,因为好写。可以想想,第一个人第k个出场,是不是1~1+k-1比他早出场,1+k~end在他后面出场(所以这些人都多等待了k个人,因而怒气值要多加上k次),那么转移式子就出来了。
题外:写这题的契机其实有二,一是昨天听同学说了一题区间dp挺有意思的去补了一发,发现自己竟然写出来了dp,说出来是有点开心的,虽然那题并不复杂。而之前一直很害怕dp,觉得能想出来转移的(当然是要能A的正解,瞎想的没有意义)简直就是神仙。最近真的认真思考了一些dp题,发现从简入繁,其实dp挺有意思的,而且个人感觉做dp最大的收益就是很容易看懂别人写的代码(不只是dp的),因为其实dp挺锻炼思维的,一旦开始思考了,理解能力肯定不断地提升。二就是觉得这题区间dp的for套路有意思,k是来枚举顺序的,和别的区间dp(目前自己做到的)不太一样,就放了上来。


Codes:

#include <bits/stdc++.h>
#define pb push_back
#define de(x) cout << #x << " = " << x << endl
#define clr(a,b) memset(a,b,sizeof(a))
using namespace std;typedef long long ll;
const int INF = 0x3f3f3f3f;
const int N = 110;int f[N][N];
int a[N], pr[N];int main()
{int n;int cas = 1;int t;scanf("%d", &t);while ( t -- ){scanf("%d", &n);pr[0] = 0;for ( int i = 1; i <= n; i ++ ){scanf("%d", &a[i]);pr[i] = pr[i-1] + a[i];f[i][i] = 0;}for ( int len = 2; len <= n; len ++ ){for ( int l = 1, r; ( r = l + len - 1 ) <= n; l ++ ){f[l][r] = INF;for ( int k = 1; k <= len; k ++ ){f[l][r] = min( f[l][r], (k-1)*a[l] + f[l+1][l+k-1] + f[l+k][r] + k*(pr[r]-pr[l+k-1]) );}}}printf("Case #%d: %d\n", cas++, f[1][n]);   }return 0;
}

转载于:https://www.cnblogs.com/FormerAutumn/p/9819741.html

dp_c_区间dp_g相关推荐

  1. Redis 笔记(04)— list类型(作为消息队列使用、在列表头部添加元素、尾部删除元素、查看列表长度、遍历指定列表区间元素、获取指定区间列表元素、阻塞式获取列表元素)

    Redis 的列表是链表而不是数组.这意味着 list 的插入和删除操作非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为 O(n). 当列表弹出了最后一个元素之后,该数据结构自动被删除, ...

  2. LeetCode简单题之汇总区间

    题目 给定一个 无重复元素 的 有序 整数数组 nums . 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 .也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范 ...

  3. FhqTreap的区间翻转

    学 Fhq 就是为了尽量不去写某毒瘤数据结构,所以自然要来杠一杠某数据结构的经典操作:区间反转 听起来玄乎,但只需要一个小 trick 就行了:把原来的区间以下标作为权值建成 Treap , 这样整棵 ...

  4. 【基本操作】主席数统计区间不同颜色个数

    例题:询问 $n$ 个数中无修改的区间不同数个数,不带修改(SPOJ的一道题). 方法1:直接删 我们尝试头铁地开正常的下标主席树! 依次插入 $n$ 个数,插入第 $i$ 个数时,我们只要在把第 $ ...

  5. 【题解】BZOJ 3065: 带插入区间K小值——替罪羊树套线段树

    题目传送门 题解 orz vfk的题解 3065: 带插入区间K小值 系列题解 一 二 三 四 惨 一开始用了一种空间常数很大的方法,每次重构的时候merge两颗线段树,然后无限RE(其实是MLE). ...

  6. hdu 2665(主席树查询区间k大值)

    先贴我自己写的代码做模板虽然跟原博主没什么两样.(一开始空间开的4*maxn,交到hdu上一直TLE很奇怪) #include<bits/stdc++.h> using namespace ...

  7. mysql 数字区间_币投君0904丨数字货币暴跌原因何在

    昨日数字货币再次集体闪崩,btc甚至刺穿10000大关,合约帝数据显示,过去 24 小时全网爆仓超过 10 亿美元,共有 6.7 万人成为爆仓受害者.究其原因主要有两个方面:一方面是昨晚美股暴跌,三大 ...

  8. Awcing算法---区间合并

    #include <iostream> #include <algorithm> #include <vector> using namespace std; ty ...

  9. HDU - 3911 Black And White 区间翻转+区间连续最长

    区间翻转的裸题,wrong了两发,没找bug,直接又打了一遍,这么大量的代码找bug是疯了. 重新开始做线段树的一些题了,感觉对于pushdown与lazy数组有点印象了. 首先,lazy数组是记录的 ...

最新文章

  1. E: GPG 错误:http://developer.download.nvidia.com Release: 下列签名无效: NODATA 1 NODATA 2...
  2. Qt学习笔记之QTranslator
  3. 蓝桥杯 - 序列计数(记忆化搜索)
  4. 【2018.3.10】模拟赛之二-ssl2575 给出字符串【字符串】
  5. Ubuntu 18.04安装NVIDIA(英伟达) RTX2080Ti显卡
  6. 【恋上数据结构】快速排序
  7. Python——assert(断言)主进程级的终止判断语句
  8. 弥合安全和开发间隙的四个关键点
  9. abb变频器以太网适配器,ABB以太网适配器 Ethernet Adapter现货FENA-01
  10. 微信小程序调出选择好友聊天窗口
  11. 开源GIS(八)——开源GIS简史
  12. 笔记——数据归一化 scikit-learn中的Scaler
  13. 如何使用windos远程桌面连接
  14. 【软考中级-网工】1
  15. APIC Timer
  16. 招银网络科技笔试题:数字分解
  17. Docker 修改容器端口
  18. Parametric Diagrams
  19. 一个快乐网管的经验谈,教你怎样做快乐网管(转)
  20. Mysq练习----财务管理系统-数据库模块

热门文章

  1. 用技嘉Windows Image Tool给原版WIN7镜像注入USB3.0驱动
  2. java修改JFrame默认字体
  3. PyQt5 技术篇-鼠标移动控件显示提示,Qt Designer控件提示设置方法。
  4. 飞思卡尔智能车iar工程常见问题
  5. 【生活】1024,快乐
  6. CTFshow 命令执行 web53
  7. sdut 2135 数据结构实验之队列一:排队买饭
  8. [YTU]_2919( Shape系列-5)
  9. 指向常对象的指针变量
  10. 计算机英语作文句子,英语作文经典句子