HDU 4283 You Are the One ——区间dp
参考了许多大佬 尤其是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的更多相关文章
- 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
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 ...
随机推荐
- git 的相关知识
参考文章 git checkout HEAD <file> : master/HEAD -> index -> work directory index 暂存区有两行信息.分 ...
- 设置头像、商品、轮播图为背景图时需要的css
background-repeat: no-repeat;background-size: cover;background-position: center center;
- mysql批量更新的两种方式效率试验<二>
Mysql两种批量更新的对比 简介: mysql搭载mybits框架批量更新有两种方式,一种是在xml中循环整个update语句,中间以‘:’隔开,还有一种是使用case when 变相实现批量更新, ...
- mysql小细节随笔
1, MySQL decimal(x,y) 存入根据y的下一位四舍五入,查了半天以为是laravel模型做了预处理,结果发现不是,是mysql decimal类型数据自动处理的,有好,也不好,合并订 ...
- phpredis Redis阵列 Redis Arrays
官方URL:https://github.com/phpredis/phpredis/blob/master/arrays.markdown#readme 2017年10月29日20:44:01 Re ...
- 前端 html 篇
1 link和@import的区别是? 区别1:link是XHTML标签,除了加载CSS外,还可以定义RSS等其他事务:@import属于CSS范畴,只能加载CSS. 区别2:link引用CS ...
- Centos7下搭建LAMP环境,安装wordpress(不会生产博客,只是一名博客搬运工)(菜鸟)
1.搭建MySQL数据库 安装MariaDB yum install mariadb-server -y 启动MySQL服务 emctl start mariadb #启动服务 emtcl enabl ...
- C#编程基础(简单概述与理解)
1.C#变量和数据输入 C#常用到的几个数据类型: 整型:int 说明:32位有符号整数 范围:-2³¹~2³¹-1 浮点型:double 说明:64位双精度浮点数 范围:±5.0×10-﹣³²~± ...
- sql语句格式化数字(前面补0)
将一个数字例如33,或1使用t-sql语句转换成033或001 以下是详细分析: .,)得到1000 . as varchar) 将1000转换类型 .,) 从右边取3个字符得到033 将1格式化同上 ...
- python tkinter button
"""小白随笔,大佬勿喷""" '''Button按钮 点击执行对应的命令''' import tkinter as tk #初始化窗口 w ...