hdu 4283"You Are the One"(区间DP)
https://www.cnblogs.com/violet-acmer/p/9852294.html
题意:
有n个屌丝排成一排,每个屌丝都有一个不开心值a[ i ]( i=1,2,3,.....n ),如果第 i 个屌丝第 k 个上场,那么他的不开心度就是(k-1)*a[ i ]。
∑ni=1(ki-1)*a[i]的最小值,其中ki指的是第i个屌丝第k个上场。
关键条件"the director can put the boy into the dark room temporarily and let the boys behind his go to stage before him.",意思是导演可以通过将某个屌丝 i
之前的屌丝 j 放入小黑屋中使屌丝 i 在屌丝 j 前上场,不过这个小黑屋非常狭窄,先进入的最后上场,就像栈一样。
通过样例解释一下这句话:
假设有5的屌丝
id : 1 2 3 4 5
a[]: 5 8 3 9 4
按照当前的顺序,屌丝4是第4个上场的,如果想要让屌丝4第一个入场,那么,就需要将屌丝1,2,3依次放入小黑屋中,那么,屌丝1,2,3的上场顺序就是3,2,1。
题解:
定义变量dp[ i ][ j ] : ∑ji=1(ki-1)*a[i]的最小值( 1≤ki≤len,len=j-i+1(当前区间屌丝人数) )。
对于区间[ i, j ],屌丝 i 可以第 k 个上场,那么,其之后的相邻的 k-1 个屌丝一定在他之前全部上场,且他之前只有这 k-1 个屌丝上场,那么前 k 个屌丝的当前最小的
不开心度就是 (k-1)*a[ i ]+dp[ i+1 ][ i+k-1 ],那么余下的 len-k 个屌丝的最小不开心度就是 dp[ i+k ][ j ]+k*( sum(j)-sum(i+k-1) );(sum[ ]是屌丝不开心值的前缀和)。
所以dp转移方程就是 : dp[ i ][ j ]=min( dp[ i ][ j ],(k-1)*a[ i ]+dp[ i+1 ][ i+k-1 ] + dp[ i+k ][ j ]+k*( sum(j)-sum(i+k-1) ) );
AC代码:
#include<iostream>
#include<cstdio>|
#include<cstring>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
const int maxn=+; int n;
int a[maxn];
int dp[maxn][maxn];
int sum[maxn]; int Solve()
{
mem(dp,);
for(int i=;i < n;++i)
for(int j=i+;j <= n;++j)
dp[i][j]=INF; for(int len=;len <= n;++len)
{
for(int i=;i+len- <= n;++i)
{
int j=i+len-;
for(int k=;k <= (j-i+);++k)
dp[i][j]=min(dp[i][j],(k-)*a[i]+dp[i+][i+k-]+dp[i+k][j]+k*(sum[j]-sum[i+k-]));
}
}
return dp[][n];
}
int main()
{
int t;
scanf("%d",&t);
for(int kase=;kase <= t;++kase)
{
scanf("%d",&n);
sum[]=;
for(int i=;i <= n;++i)
{
scanf("%d",a+i);
sum[i]=sum[i-]+a[i];
}
printf("Case #%d: %d\n",kase,Solve());
}
return ;
}
hdu 4283"You Are the One"(区间DP)的更多相关文章
- 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 ...
随机推荐
- 利用Python实现“指尖陀螺”,让你释放压力
前言 利用Python实现“指尖陀螺”,让你释放压力 基本环境配置 版本:Python3 系统:Windows 相关模块:turtle 实现效果 不停点击键盘空格键,这个陀螺会慢慢加速,从而达到一个减 ...
- 设计模式笔记:开闭原则(OCP,The Open-Closed Principle)
1. 开闭原则概述 开闭原则(OCP,The Open-Closed Principle)两个主要特征: (1)对扩展开放(open for extension):模块的行为的可以扩展的,当应用的需求 ...
- Tembin
1:组织机构和用户之间是多对一的关系,一个组织结构可以有多个成员,一个成员只能属于一个组织机构. 2:app里面的邀请成员:是邀请发送短信通知用户注册tembin账户,当用户去注册的时候下面就会显示所 ...
- JQ用法
jQuery简称jq,是一款同prototype一样优秀js开发库类,特别是对css和XPath的支持,使我们写js变得更加方便!如果你不是个js高手又想写出优 秀的js效果,jq可以帮你达到目的!下 ...
- 4、new一个对象的时候,初始化顺序:
父类静态块>子类静态块> 父类属性(先系统默认值,后直接你赋予的值) >父类构造器>子类属性>子类构造器
- BZOJ2151种树——模拟费用流+链表+堆
题目描述 A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树.园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n.并且每个位置都有一个美观度Ai,如果在这 ...
- ConnectionAbortedError: [WinError 10053] 您的主机中的软件中止了一个已建立的连接
socket服务端在接收socket客户端时抛出异常 ConnectionAbortedError: [WinError 10053] 您的主机中的软件中止了一个已建立的连接. socket服务端代码 ...
- 【洛谷U20626】gemo 容斥 FWT 高斯消元
题目大意 给你一个无向图,有\(m\)个询问,每次给你一个点\(x\)和一个点集\(S\),问你从\(x\)开始走,每次从一个点随机的走到与这个点相邻的点,问你访问\(S\)中每个点至少一次的期望步数 ...
- 【HDU - 4348】To the moon(主席树在线区间更新)
BUPT2017 wintertraining(15) #8G 题意 给一个数组a,有n个数,m次操作.\(N, M ≤ 10^5, |A i| ≤ 10^9, 1 ≤ l ≤ r ≤ N, |d| ...
- 【比赛】NOIP2018 货币系统
可以发现最后的集合一定是给定集合的子集 所以就变成了裸的背包嘛,对于每个数判断它能不能被其它数表示出来,如果可以,就表示这个数是没用的,可以去掉 #include<bits/stdc++.h&g ...