参考了许多大佬  尤其是https://blog.csdn.net/woshi250hua/article/details/7973824这一篇 ,最后我再加一点我的见解。

大意是 给定一个序列,序列内的人有屌丝值Di,将这个序列进栈,第i个人如果是第k个出栈,那么最后的屌丝总值增加Di * (k-1), 求一个出栈序列使得总屌丝值最小。

这一题用到了一个性质,如果第1个人确定了是第k个出栈,那么第2~k个人一定在他之前出栈,而且k+1~n个人一定在他之后出栈。这个可以随便拿纸模拟一下来得出结论。

然后区间划分的思路就有了,枚举一下k,处理出[l,r]区间l第k个弹出时的最小总屌丝值。最后dp[1][n][1]就是最终解。

代码如下:

#include<iostream>
#include<string.h>
using namespace std;
#define INF (1<<29)
#define ll long long
ll dp[][][],n,a[],ans;
ll solve(ll l,ll r,ll k)
{
if(l>r) return ; //无意义值直接返回
if(l==r) return a[l]*(k-); //递归到单点,意味着该值意义为“第l个人第k个出场带来的屌丝值”
if(dp[l][r][k]!=INF) return dp[l][r][k]; //不为INF代表该值之前走到过,就不用再走了,直接返回该值 ll qian,hou,qiank,houk,now;
// 根据之前的结论,我们把区间[l,r]分为三个部分 l、l+1~k、k+1~r for(int i=l;i<=r;i++)
{
houk=k+i-l+;//该值houk表示递归区间k+1~r时带入的k
qiank=k+i-l;//该值qiank示第l号人出场的序号
qian=solve(l+,i,k);//该值qian表示递归区间l+1~i时返回的最优值
hou=solve(i+,r,houk);//该值hou表示递归区间i+1~r时返回的最优值
now=a[l]*(qiank-);//l号选手的屌丝值
dp[l][r][k]=min(dp[l][r][k],qian+hou+now); //更新最优值
}
return dp[l][r][k];
}
int main()
{
ll i,j,k,l,ans,t,n;
//cout<<INF<<endl;
cin>>t;
l=;
while(t--)
{
l++;
cin>>n;
for(i=;i<=n;i++) cin>>a[i];
for(i=;i<=n;i++)
for(j=;j<=n;j++)
for(k=;k<=n;k++) dp[i][j][k]=INF;//提示这里的INF比较大 不能用memset来赋值 不然会出问题
ans=solve(,n,);
cout<<"Case #"<<l<<": "<<ans<<endl;
}
}

HDU 4283 You Are the One ——区间dp的更多相关文章

  1. hdu 4283"You Are the One"(区间DP)

    传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题意: 有n个屌丝排成一排,每个屌丝都有一个不开心值a[ i ]( i=1,2,3,.. ...

  2. 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) ...

  3. HDU 4283 (第k个出场 区间DP)

    http://blog.csdn.net/acm_cxlove/article/details/7964594 http://www.tuicool.com/articles/jyaQ7n http: ...

  4. 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 ...

  5. HDU 5900 QSC and Master (区间DP)

    题目链接   http://acm.hdu.edu.cn/showproblem.php?pid=5900 题意:给出序列$A_{i}.key$和$A_{i}.value$,若当前相邻的两个数$A_{ ...

  6. HDU 5115 (杀狼,区间DP)

    题意:你是一个战士现在面对,一群狼,每只狼都有一定的主动攻击力和附带攻击力.你杀死一只狼.你会受到这只狼的(主动攻击力+旁边两只狼的附带攻击力)这么多伤害~现在问你如何选择杀狼的顺序使的杀完所有狼时, ...

  7. hdu 4632 子字符串统计的区间dp

    题意:查找这样的子回文字符串(未必连续,但是有从左向右的顺序)个数. 简单的区间dp,哎,以为很神奇的东西,其实也是dp,只是参数改为区间,没做过此类型的题,想不到用dp,以后就 知道了,若已经知道[ ...

  8. HDU 2517 / POJ 1191 棋盘分割 区间DP / 记忆化搜索

    题目链接: 黑书 P116 HDU 2157 棋盘分割 POJ 1191 棋盘分割 分析:  枚举所有可能的切割方法. 但如果用递归的方法要加上记忆搜索, 不能会超时... 代码: #include& ...

  9. hdu 2476 (string painter) ( 字符串刷子 区间DP)

    String painter Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

随机推荐

  1. ArcGIS AddIn调用ArcMap自带的对话框

    ESRI.ArcGIS.Framework命名空间提供了ArcGIS常用的一些对话框,可以在开发时直接调用这些对话框,而不需要重新去写Form 主要对话框有 1.IColorBrowser/IColo ...

  2. mui 滑块开关 进度条 以及如何获取值

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  3. 利用XML语法 SQL 列转行

    --行转列 固定xml语法 declare @xml xml ; set @xml=cast('<v>2</v><v>4</v><v>3&l ...

  4. java+js实现展示本地文件夹下的所有图片demo[申明:来源于网络]

    java+js实现展示本地文件夹下的所有图片demo[申明:来源于网络] 地址:http://blog.csdn.net/allgis/article/details/46364875

  5. Linux命令 sed

    一. 以行为单位进行操作. d:删除 $ nl passwd | sed '2,5d'  # 删除第2~5行 $ nl passwd | sed '2d'  # 删除第2行 $ nl passwd | ...

  6. [tldk][dpdk][dev] TLDK--基于dpdk的用户态协议栈传输层组件简单调研

    如题,以下是一份简单的快速调研. TLDK: Transport Layer Development Kit 一 什么是TLDK transport layer development kit 处理t ...

  7. scrollview嵌套tableview

    之前写过一次,忘记了, 用的通知 FS

  8. Spring Boot 自动配置原理(精髓)

    一.自动配置原理(掌握) SpringBoot启动项目会加载主配置类@SpringBootApplication,开启@EnableAutoConfiguration自动配置功能 @EnableAut ...

  9. 1、jeecg 笔记开篇

    1. 前言 终究还是入了 jeecg 的 "坑",国庆后公司采用该框架开发,故开篇记录. 虽说入"坑",但不得不承认 jeecg 确实是一个非常强大的平台. 其 ...

  10. python基础之 基本数据类型,str方法和for循环

    1.概念 1.十进制转二进制,对2取余,余数倒序排列 2.字符串为空的时候,bool值为false,字符串非空就是True3.字符串转化成int时,必须是只包含数字才能转化.4.字符串转化成int时可 ...