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 ...
随机推荐
- centos7虚拟机下python3安装matplotlib遇到的一些问题
1.安装位置 centos7虚拟机+python3.6 2.问题 2.1如果是使用的python2版本可以使用如下方式, #yum search matplotlib 返回如下: 已加载插件:fast ...
- Linux基本命令总结(九)
接上篇: 46,scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下 ...
- python中assert()函数的使用
关于assert()函数的使用,主要参考博客https://blog.csdn.net/qq_37119902/article/details/79637578 assert函数主要是用来声明某个函数 ...
- usb的hid鼠标键盘报告描述符(五)
title: usb的hid鼠标键盘报告描述符 tags: linux date: 2018/12/20/ 18:05:08 toc: true --- usb的hid鼠标键盘报告描述符 https: ...
- SpringCloud笔记三:Eureka服务注册与发现
目录 什么是Eureka? Eureka注册的三大步 第一步,引用Maven 第二步,配置yml 第三步,开启Eureka注解 新建Eureka子项目 把provider子项目变成服务端 Eureka ...
- python 错误捕获机制分析
python语言是编程中使用率在Top 3之内的语言.python语言以灵活与简单著称,那么越是灵活的语言越需要判断出错的功力. 简单示例 以下是一个简单的错误程序,被除数不可为0,那么看看该代码的执 ...
- SHELL希尔排序
/****************************************************************************** * Compilation: javac ...
- ssh远程登陆脚本(带跳板机)
mac自带的终端不太好用,被推荐了一个iterm2的终端替代工具,确实比自带的终端好用不少.下面记录下通过脚本一键远程登录的过程: 下载地址:http://m4.pc6.com/xuh3/iTerm2 ...
- 软件测试之adb命令-实际公司使用场景--今日log
软件测试之adb命令-实际公司使用场景--今日log Dotest-董浩整理 1)可以看内存泄漏: 2)可以安装.卸载app--截图并提交bug: 3)可以通过抓app日志定位问题: 4)可以结合mo ...
- vivado中使用ROM IP核
1.在project中选择IP Catalog 在IP Catalog中选择---->Block Memory Generator------>RAMs&ROMs&BRAM ...