HDU 4283 You Are the One 【区间DP】
<题目链接>
题目大意:
有$n$个人排成一排要上台表演,每个人有一个屌丝值$pi$。第i个上台表演的人,他的不满意度为$(i-1)*p_i$。现在有一个类似于栈的黑屋子,你可以让某些人进入这个黑屋子。这些人要按照初始顺序来调整,对于排在最前面的人,有两种选择,让他直接上场或者先让他入栈。现在请你选择一个合理的上场顺序,使得最后总的不满意度最小。
解题分析:
因为是根据栈来调整上场顺序,所以将$p_i$大的人安排的尽可能靠前,这个贪心策略是错误的(很容易找到反例)。
考虑用区间DP,dp[l][r]表示区间[l,r]内的最小价值,再枚举第$i$个人的上场次序,同时dp进行状态的转移 $$dp[l][r]=min(dp[l][r],(k-l)*val[l]+dp[l+1][k]+dp[k+1][r]+(sum[r]-sum[k])*(k+1-l));$$详细题解见 >>>
记忆化搜索版
#include <bits/stdc++.h>
using namespace std; const int INF = 0x3f3f3f3f , N = ;
int n;
int dp[N][N],sum[N],val[N]; int DP(int l,int r){
if(l>=r)return ;
if(dp[l][r]!=-)return dp[l][r];
dp[l][r]=INF;
for(int k=l;k<=r;k++) //枚举第i个人是第几个上场的
dp[l][r]=min(dp[l][r],(k-l)*val[l]+DP(l+,k)+DP(k+,r)+(sum[r]-sum[k])*(k+-l)); //因为[k+1,r]的人的上场次序是处理的相对次序,所以这里要加上(sum[r]-sum[k])*(k+1-l)才能表示绝对次序造成的价值
return dp[l][r];
}
int main(){
int T,ncase=;cin>>T;
while(T--){
memset(dp,-,sizeof(dp));
cin>>n;sum[]=;
for(int i=;i<=n;i++){
scanf("%d",&val[i]);
sum[i]=sum[i-]+val[i];
}
printf("Case #%d: %d\n",++ncase,DP(,n));
}
}
普通区间DP
#include <bits/stdc++.h>
using namespace std; const int N = ;
int n,dp[N][N],val[N],sum[N]; int main(){
int T,ncase=;cin>>T;
while(T--){
scanf("%d",&n);
sum[]=;
for(int i=;i<=n;i++)
scanf("%d",&val[i]),sum[i]=sum[i-]+val[i];
memset(dp,,sizeof(dp)); //dp初始化
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)dp[i][j]=1e9;
for(int len=;len<=n-;len++){
for(int l=;l<=n-len;l++){
int r=l+len;
for(int k=l;k<=r;k++)
dp[l][r]=min(dp[l][r],(k-l)*val[l]+dp[l+][k]+dp[k+][r]+(sum[r]-sum[k])*(k+-l)); //因为[k+1,r]的人的上场次序是处理的相对次序,所以这里要加上(sum[r]-sum[k])*(k+1-l)才能表示绝对次序造成的价值
}
}
printf("Case #%d: %d\n",++ncase,dp[][n]);
}
}
HDU 4283 You Are the One 【区间DP】的更多相关文章
- hdu 4283"You Are the One"(区间DP)
传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题意: 有n个屌丝排成一排,每个屌丝都有一个不开心值a[ i ]( i=1,2,3,.. ...
- HDU 4283 You Are the One ——区间dp
参考了许多大佬 尤其是https://blog.csdn.net/woshi250hua/article/details/7973824这一篇 ,最后我再加一点我的见解. 大意是 给定一个序列,序列 ...
- hdu 4283 You Are the One 区间dp
You Are the One Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU 4283 (第k个出场 区间DP)
http://blog.csdn.net/acm_cxlove/article/details/7964594 http://www.tuicool.com/articles/jyaQ7n http: ...
- HDU 4283---You Are the One(区间DP)
题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=4283 Problem Description The TV shows such as Y ...
- HDU 5900 QSC and Master (区间DP)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5900 题意:给出序列$A_{i}.key$和$A_{i}.value$,若当前相邻的两个数$A_{ ...
- HDU 5115 (杀狼,区间DP)
题意:你是一个战士现在面对,一群狼,每只狼都有一定的主动攻击力和附带攻击力.你杀死一只狼.你会受到这只狼的(主动攻击力+旁边两只狼的附带攻击力)这么多伤害~现在问你如何选择杀狼的顺序使的杀完所有狼时, ...
- hdu 4632 子字符串统计的区间dp
题意:查找这样的子回文字符串(未必连续,但是有从左向右的顺序)个数. 简单的区间dp,哎,以为很神奇的东西,其实也是dp,只是参数改为区间,没做过此类型的题,想不到用dp,以后就 知道了,若已经知道[ ...
- HDU 2517 / POJ 1191 棋盘分割 区间DP / 记忆化搜索
题目链接: 黑书 P116 HDU 2157 棋盘分割 POJ 1191 棋盘分割 分析: 枚举所有可能的切割方法. 但如果用递归的方法要加上记忆搜索, 不能会超时... 代码: #include& ...
- hdu 2476 (string painter) ( 字符串刷子 区间DP)
String painter Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
随机推荐
- Scrapy 框架 配置文件
配置文件 基本配置 #1.项目名称,默认的USER_AGENT由它来构成,也作为日志记录的日志名 BOT_NAME = 'Amazon' #2.爬虫应用路径 SPIDER_MODULES = ['Am ...
- 一种使用 sprintf 导致死机的情况
@2019-02-26 [小记] char temp[10] float money; sprintf(temp, "0.2f", money); 以上使用方法可能导致死机,原因是 ...
- Forget Guava: 5 Google Libraries Java Developers Should Know
Forget Guava: 5 Google Libraries Java Developers Should Know Published on 2016 7 13 Somenath PandaFo ...
- SQL中GROUP BY用法示例(转)
工作中又用到了写SQL 好多年不用了 再拿过来温习下: 不觉豁然开朗 概述 GROUP BY我们可以先从字面上来理解,GROUP表示分组,BY后面写字段名,就表示根据哪个字段进行分组,如果有用Exce ...
- usb的hid鼠标键盘报告描述符(五)
title: usb的hid鼠标键盘报告描述符 tags: linux date: 2018/12/20/ 18:05:08 toc: true --- usb的hid鼠标键盘报告描述符 https: ...
- jQuery使用(九):队列及实现原理、基于队列模拟实现animate()
开篇一张图之队列模型 queue()如何使用? queue()原理实现? 基于queue()模拟实现animate() 一.使用queuer方法.理解队列原理 queue() dequeue() cl ...
- 第二十节: 深入理解并发机制以及解决方案(锁机制、EF自有机制、队列模式等)
一. 理解并发机制 1. 什么是并发,并发与多线程有什么关系? ①. 先从广义上来说,或者从实际场景上来说. 高并发通常是海量用户同时访问(比如:12306买票.淘宝的双十一抢购),如果把一个用户看做 ...
- 使用SIGALARM为recvfrom设置超时
static void sig_alrm(int); void dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen) ...
- notepad++ 代码注释快捷键
在用notepad++进行代码编辑的过程中 单行.多行注释 //方式 :ctrl+k 取消单行.多行.区块注释 :ctrl+sh ...
- Python3:关于列表的操作(合并、拼接,嵌套排序··)
一:# 将2个列表合并成字典,按最少个数key=['winnie','anna','lisa']value=[18,20,22] k_v=dict(zip(key,value))print(k_v) ...