hdu4283 You Are the One 区间dp 记忆化搜索or递推

Educoder | 计算机网络实验-Ping命令与ICMP协议分析 任务描述本关任务:捕获 Ping 程序生成的数据包。相关知识ping命令Ping 程序是一个简单的工具,允许任何人(例如:网络管理员)验证主机是否存在。源主机中的 Ping 程序将数据包发送到目标 IP 地址;如果目标是在线的,则目标主机中的 Ping 程序将会发送响应 Ping 数据包证明他在线,这两个 Ping 数据包都是 ICMP 数据包。在 Unix/Linux,序列号从 0 开始计数,依次递增。而 Windows 中 ping 程序的 ICMP 序列号是没有规律;;。 阅读详情

You Are the One

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3032    Accepted Submission(s): 1352


Problem Description
  The TV shows such as You Are the One has been very popular. In order to meet the need of boys who are still single, TJUT hold the show itself. The show is hold in the Small hall, so it attract a lot of boys and girls. Now there are n boys enrolling in. At the beginning, the n boys stand in a row and go to the stage one by one. However, the director suddenly knows that very boy has a value of diaosi D, if the boy is k-th one go to the stage, the unhappiness of him will be (k-1)*D, because he has to wait for (k-1) people. Luckily, there is a dark room in the Small hall, so the director can put the boy into the dark room temporarily and let the boys behind his go to stage before him. For the dark room is very narrow, the boy who first get into dark room has to leave last. The director wants to change the order of boys by the dark room, so the summary of unhappiness will be least. Can you help him?
 

Input
  The first line contains a single integer T, the number of test cases.  For each case, the first line is n (0 < n <= 100)
  The next n line are n integer D1-Dn means the value of diaosi of boys (0 <= Di <= 100)
 

Output
  For each test case, output the least summary of unhappiness .
 

Sample Input
2    5 1 2 3 4 5 5 5 4 3 2 2


看了半个上午网上的题解才基本上明白了......边界处理的好微妙...dp大法好

网上大神写的题解都好简练。。。写下自己的理解思路,顺便加强下印象

题意说的是1 - n个屌丝男,然后通过一个小黑屋也就是个栈可以改变他们的顺序,每个人有个屌丝值,然后如果这个人排第k个,则他的不高兴值为(k - 1) * D

问所有人的不高兴值之和最小是多少


先分析这个问题,对于区间1 - n,第一个人可能是第一个上场,也可能是第n个上场,其实对于第一个人,他有可能是1 - n中第k个上场(1 <= k <= n)

为什么他可以是第1 - n中任意一个上场呢,因为

比如说这样

原始队伍:1 2 3 4 5

栈底-->2 3 4 5<--栈顶        舞台 :1

1直接上舞台,剩下的四个可以直接上,也可以先进小黑屋再上,这时候1就是第一个上了


栈底-->1 2 3 4 5<--栈顶     舞台:null

栈底-->1 2 3<--栈顶            舞台:4 5

比如这两种情况,1就是最后上场的


还有在1 - n之间的

队伍:3 4 5

栈底-->1 2<--栈顶       舞台:null

然后这时先让1 2出栈上舞台

队伍:3 4 5

栈底--><--栈顶            舞台:2 1

然后3 4 5再上

栈底--><--栈顶            舞台:2 1 3 4 5

这时候1就是排第二了,其他位置也可以相似地得到


发现了子问题

因为1可以是第1 - n中任意一个上舞台,不妨设他是第k个上的,然后发现在考虑这个问题的时候考虑哪种情况都是可以分成三部分

标号为1的屌丝本身,上舞台之后排在在1之前的k - 1个,在1之后的n - k个

然后再看在1之前上舞台的k - 1个屌丝,他们可以以同样的分析方法进行更小范围的独立分析,在1之后的n - k个也可以


1在第k个上舞台时,他的不高兴值为a[i] * (k - 1),那么只要知道他之前的所有屌丝的不高兴值之和的最小值sumpre,和他之后的所有屌丝的不高兴值之和的最小值之和sumnext,最后1 - n上的最小值就是

a[i] * (k - 1) + sumpre + sumnext

sumpre和sumnext又可以以同样的方式递归分析下去

直到精确到不可再分的区间长度为一的个人


定义函数int solve(i, j)函数返回区间[i, j]上的题目要求的最小值,那么

solve(i, j) = min(solve(i + 1, i + k - 1) + solve(i + k, j) + a[i] * (k - 1) + (sum[j] - sum[i + k - 1]) * k)      (1 <= k <= j - i + 1)


区间[i, j]

i                i  + 1, i + 2, i + 3, ..........,i + k - 1                 i + k ..........i + k + 1.........j

第k个上                             之前的k - 1个                                     之后的 j - i - k + 1个


因为在第i之后的那个区间[i + k, j]在分析的时候是内部独立考虑的,因为在考虑这个子问题的时候肯定不知道它外面的父问题是什么

所以在[i + k, j]上的最优解只是独立考虑[i + k, j]的最小值,在综合到[i, j]这个区间时由于[i, i + k - 1]这k个都在他们前面所以

[i + k, j]这个最优解还要再加上D(i + k)  *  k     + D(i + k + 1)  *  k      +     ......     +    D(j) * k,   D(x)为第x个屌丝的屌丝值

如果用前缀和来表示的话就是前j个的屌丝值和sum[j],前i + k - 1个的屌丝值和sum[i + k - 1]

D(i + k)  *  k     + D(i + k + 1)  *  k      +     ......     +    D(j) * k = (sum[j] - sum[i + k - 1]) * k


边界

发现在k = 1时

solve(i + 1, i) + solve(i + 1, j) + a[i] * (1 - 1) + (sum[j] - sum[i]) * 1

这个时候也就是第i个是排在[i, j]这个区间的第一个,可见他之前没有别人,从i + 1到j全在他后面

而且有个没有意义的solve(i + 1, i)明显要让这个值有意义只有让它等于0

solve(i + 1, j) + (sum[j] - sum[i])


在k = j - i + 1时

solve(i + 1, j) + solve(j + 1, j) + a[i] * (j - i) + (sum[j] - sum[j]) * (j - i + 1);

这个时候i排在[i, j]这个区间最后一个,从i + 1到j全在他前面

这时候又出现了solve(j + 1, j)没有意义,也是明显他要等于0,而且因为都在i前面,所以[i + 1, j]上的所有屌丝都不用补(sum[j] - sum[i + k - 1]) * k) 了,当然为0

solve(i + 1, j) + a[i] * (j - i) 


实现

记忆化搜索,由于系统调用栈,相对慢一些


//记忆化搜索
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int maxn = 100 + 10, INF = 0x3f3f3f3f;
int n, a[maxn], sum[maxn], dp[maxn][maxn];

int solve(int i, int j) {
	if (i > j) return 0;
	int ans = dp[i][j];
	if (ans != -1) return ans;
	ans = INF;
	for (int k = 1; k <= j - i + 1; k++) {
		ans = min(ans, solve(i + 1, i + k - 1) + solve(i + k, j) + a[i] * (k - 1) + (sum[j] - sum[i + k - 1]) * k);
	}
	return dp[i][j] = ans;
}

int main()
{
	int T;
	scanf("%d", &T);
	for (int t = 1; t <= T; t++) {
		scanf("%d", &n);
		sum[0] = 0;
		for (int i = 1; i <= n; i++) {
			scanf("%d", &a[i]);
			sum[i] = sum[i - 1] + a[i];
		}
		memset(dp, -1, sizeof(dp));
		printf("Case #%d: %d\n", t, solve(1, n));
	}
	return 0;
}



开数组直接递推,很快

形象来看像是这么个过程,就是父问题去覆盖子问题的过程,每次的覆盖范围都在扩大,最终扩大到n,将所有的子问题的

解都覆盖了,也就是所有子问题向上构成了最终问题的解,dp的奇妙之处啊啊啊啊啊啊啊啊啊。。。。









//递推
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int maxn = 100 + 10, INF = 0x3f3f3f3f;
int n, a[maxn], sum[maxn], dp[maxn][maxn];

int main()
{
	int T;
	scanf("%d", &T);
	for (int t = 1; t <= T; t++) {
		scanf("%d", &n);
		sum[0] = 0;
		for (int i = 1; i <= n; i++) {
			scanf("%d", &a[i]);
			sum[i] = sum[i - 1] + a[i];
		}
		for (int i = 0; i <= n; i++) {
			for (int j = 0; j <= n; j++) {
				if (i > j)
					dp[i][j] = 0;
				else
					dp[i][j] = INF;
			}
		}
		/*l为计算的区间长度
		要先有子问题的最优解才能向上推出更大区间的最优解
		所以先是区间长度为1的最优解,然后为2。。。一直到整个区间[1, n]
		*/
		for (int l = 1; l <= n; l++) {
			for (int i = 1; i <= n; i++) {
				int j = i + l - 1;
				if (j > n) continue; //防越界
				for (int k = 1; k <= j - i + 1; k++) {
					dp[i][j] = min(dp[i][j], dp[i + 1][i + k - 1] + dp[i + k][j] + (k - 1) * a[i] + (sum[j] - sum[i + k - 1]) * k);
				}
			}
		}
		printf("Case #%d: %d\n", t, dp[1][n]);
	}
	return 0;
}



【小白深度教程 1.3】使用 BP-Net 深度补全网络,进行 KITTI 稠密点云和图像融合(Depth Completion 实战) 在上一节中,我们展示了如何将从激光雷达获取的稀疏点云(深度)映射到图像。因此这篇论文我们尝试使用 Depth Completion(深度补全)技术,来将稀释的点云深度,补全为稠密深度。 阅读详情

相关推荐

PaddleOCR SVTRv2中文识别模型训练全流程:从数据准备到推理部署

本文详细介绍了基于PaddleOCR的SVTRv2中文识别模型从数据准备、模型训练到推理部署的全流程实战。SVTRv2凭借其单视觉Transformer架构和分层混合机制,在中文文字识别任务上实现了高精度与效率的平衡。文章重点解析了数据工程、训练调优技巧及部署优化方案,帮助开发者构建定制化的OCR解决方案。

weixin_29194817的博客 286

hdu4283(You Are the One)(dps+dp)

http://acm.hdu.edu.cn/showproblem.php?pid=4283 (1)代码量短,主要是要分析清楚问题的本质。用到深搜和动态规划,精髓是动态规划里包含的思维。 他人代码: View Code #include <iostream> #include <cstdio> #include <algorithm> #de...

weixin_30687051的博客 194

BOM 数据模型设计

字段名数据类型必填说明物料编码 (Part Number)字符串是唯一标识,主键。建议包含分类前缀(如STD-GEN-CUS-物料名称 (Part Name)字符串是版本 (Revision)字符串是如AB1.0,与编码组合构成唯一实例。状态 (Status)枚举是设计中(Draft)已发布(Released)已归档(Archived)已作废(Obsoleted)类型 (Type)枚举是专用件(Custom)借用件(Borrowed)通用件(Generic)标准件(Standard)

Davina_yu的博客 1756

HDU4283(区间DP)

题目链接 DP这东西还是一如既往的毁天灭地的难啊。 题意:有n个人参加非诚勿扰,每个人都有ninin_i的屌丝值,如果前面有k个人比他早,他就会有(k−1)∗(ni)(k−1)∗(ni)(k-1)*(n_i)的屌丝值,你可以让一些人进入一个小黑屋,来改变上场顺序,但是小黑屋是类似栈,先入后出。 题解: dp[i][j]表示i~j区间的最优解。 对于i~j区间来说,第i个人可以第一个上,也...

开心铁匠铺 458

AI编程实战:用Spec Coding与Codex半小时重构全栈项目

这次我们来看一个能显著提升全栈开发效率的实战方法:利用 AI 编程工具 Codex 和 Spec Coding 工作流,将原本需要数周甚至一个月的全栈项目重构工期,压缩到半小时级别。这不是概念探讨,而是基于现有工具链的、可立即上手的工程实践。 对于前端开发者或全栈工程师而言,面对老旧项目重构、技术栈升级或从零搭建新项目时,最大的痛点往往是重复性、模式化的代码编写工作。手动编写 CRUD 接口、页面组件、状态管理和联调测试,耗时费力且容易出错。而 AI 辅助编程的核心价值,正是在于将开发者从这些“体力活”中解

weixin_33525298的博客 290

手把手教你用C语言实现GNSS卫星方位角计算(附RTKLIB风格代码解析)

本文详细介绍了如何使用C语言实现GNSS卫星方位角计算,包括从地固坐标系到站心坐标系的转换链条。通过RTKLIB风格的代码解析,展示了XYZ到ENU坐标转换的核心原理和C语言实现框架,帮助开发者掌握卫星方位角和高度角的计算技巧,适用于GNSS观测数据质量分析和精密定位算法开发。

weixin_30699915的博客 364

一道有趣的区间DP--HDU4283(通俗易懂,附加栗子)

不知道是听谁说的,这是一道区间DP的入门题,对于区间思想确实是一道入门题,但是DP方程个人觉得还是很难的,反正我这种蒟蒻肯定是想不出来的。嘤 首先感谢资料:https://blog.youkuaiyun.com/libin56842/article/details/9722077 来看一下题目: 有一群人,按照给定输出从1到n排好了顺序,准备一个接一个的出去.此外旁边还一个小黑屋(一个类似于栈的东西),可以用...

Zenith_Habitant的博客 415

096、PCIE环回模式(Loopback):调试时自己和自己对话的利器

摘要: PCIE环回模式是调试利器,通过让芯片内部数据自环来定位问题层级。文章详解三种环回模式:物理层环回验证基础收发,数据链路层环回测试DLLP机制,事务层环回验证端到端协议。分享了实战中的典型问题(时钟异常、状态机卡死、计数器失真)和"从下往上"的调试流程,强调要区分调试与生产功能,建议早期验证环回模式。通过具体代码示例和调试案例,说明合理使用环回模式能显著提升排查效率,是PCIE调试必备技能。(149字)

z534437748的博客 105

HDU4283:You Are the One(区间DP)

Problem Description   The TV shows such as You Are the One has been very popular. In order to meet the need of boys who are still single, TJUT hold the show itself. The show is hold in the Small...

anp53732的博客 126

GJB设计开发各阶段的文件和记录要求

GJB设计开发各阶段的文件和记录要求

Abel的博客 4050

社会网络仿真软件:NetLogo_(14).社会网络数据导入与导出

在NetLogo中,社会网络的仿真不仅依赖于模型的内部逻辑,还需要能够灵活地导入和导出数据。这使得用户可以利用外部数据来初始化模型,或者将模型的运行结果导出以便进一步分析。本节将详细介绍如何在NetLogo中实现社会网络数据的导入和导出,包括常见的数据格式和具体的代码示例。

kkchenjj的博客 598

HDU4283-You Are the One(区间dp 模拟栈)

题目链接 Problem Description   The TV shows such as You Are the One has been very popular. In order to meet the need of boys who are still single, TJUT hold the show itself. The show is hold in the Smal...

QAQ 464

122、Android Camera HAL3 框架:Request、Result、Metadata 的异步管道模型

本文深入剖析了Android Camera HAL3框架中的异步管道模型,围绕Request、Result和Metadata三个核心要素展开。作者通过实际案例(黑屏闪退问题)切入,揭示了异步模型中常见的帧序错乱陷阱。文章详细阐释了三个角色的交互机制,指出HAL3采用生产者-消费者模式的关键特征:Request与Result一一对应但不保证顺序。针对开发实践,总结了三个必须加锁的场景和回调函数的锁使用禁忌,并给出解决帧序问题的具体方案(独立帧号生成器)。最后提出五项经验性建议,强调异步模型带来的灵活性与复杂性

sundong_81的博客 211

HDU4283 You Are the One —— 区间DP

题目链接:https://vjudge.net/problem/HDU-4283 You Are the One Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4667Accepted Submission(s...

alince20008的博客 162

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

HDU 4283 You Are the One(区间dp、状态转移)

题目链接; HDU 4283 You Are the One 题意: 【非诚勿扰?】 有nn个人需要上台,每个人的初始diaosi值(题目就这么说的)是data[i]data[i],如果ii是第kk个上场的话就会产生(k−1)∗data[i](k-1)*data[i]的愤怒值,但是允许先将某些人带进小黑屋中,后进后出原则,求所有人都上场的最小愤怒值之和? 数据范围:n≤100,data[i

ramay7 637

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

区间dp入门——总结+习题+解析

前天学长拉了个区间dp的专题,花了两个做,今天就来做个总结吧!!! 区间dp其实就是一种建立在线性结构上的对区间的动态规划,dp本来就是很奇妙的东西,也没有什么套路,就是一种思考的数学思维方式,只有做足够多的题并且想的足够多才可能在比赛中做出来。 区间dp,顾名思义,在区间上dp,大多数题目的状态都是由区间(类似于dp[l][r]这种形式)构成的,就是我们可以把大区间转化成小区间来处理,然后对...

mumei的博客 1万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

HDU4283——You Are the One(区间DP)

题目大意: 有n个男屌丝事先按1,2,3,,,,,,n的顺序排好,每个人都有一个不开心值unhappy[i],如果第i个人第k个上台找对象,那么该屌丝男的不开心值就会为(k-1)*unhappy[i],因为在他前面有k-1个人嘛,导演为了让所有男屌的总不开心值最小,搞了一个小黑屋,可以通过小黑屋来改变男屌的出场顺序 注意:这个小黑屋是个栈,男屌的顺序是排好了的,但是可以通过入栈出栈来改变男屌的

fsdcyr 1297

HDU 4283 You Are the One

#include #include #include using namespace std; const int maxn = 111; const int inf = 1e8; int dp[maxn][maxn]; int d[maxn]; int sum[maxn]; int n; int main() { int T; scanf("%d",&T);

\*zyeric*/ 453

HDU4283:You Are the One

Pre 准备 \(PPT\) 的时候遇到的有一点神奇的题目。 直接看题解,不然 \(PPT\) 做不完。 Solution 考虑 \(dp[i][j]\) 表示区间 \([i,j]\) 的答案,难在设计方程。 可以考虑第 \(i\) 个人什么时候出栈,假设为 \(k\) ,那么一定是它之后连着的 \(k\) 个人出栈,不能有后面的,否则不合法。 如果是大于 \(j-i+1\) 个出栈的,...

weixin_30608131的博客 124

hdu4283 You Are the One(区间dp,思考)

hdu4283分析这微博主写得很清楚了:http://blog.youkuaiyun.com/u014141559/article/details/38035603?utm_source=tuicool&utm_medium=referral 关键就是要想到,这个栈可以类比区间,而且还真的是,能想到挺厉害的,这里也是开拓了思路。题目http://acm.hdu.edu.cn/showproblem.php?p

天道酬勤 302

HDU 4283 You Are the One

区间dp,如果一个人入栈的话,那到这个人出栈的那一段上台的人肯定是原本位置和当前位置之间的那些人,所以这一个区间可以考虑为一种情况,所以就把问题弄成把一个大区间分解,找出满足题意的最小值了,于是就成为了区间dp问题了dp[l][r]表示只有这个区间的值时可以得到的最小值,考虑区间(l,r) 则一种情况是把区间继续往下分,于是dp[l,r] = min(dp[l,r], dp[l][i] + dp[

ok_again的专栏 979

hdu4283区间dp 记忆化搜索 区间分化

题意:给你一些人的屌丝值Di,计算总屌丝值=sum((k-1)*Di),k为第i个人进入的位置。给你一个栈,可以使人的位置改变。 方法一:记忆化搜索 dp[i][j][k]表示区间[i,j]第i个人放在k位置的屌丝值。 搜索所有的状态,记录已经搜索的状态。 代码: //记忆化搜索 //这里也可以用二维的数组,另外用一个sum数组和。不过三维的实在是太神了 #include #includ

845

HDU 4283 You Are the One(区间DP)

/* 这道题才真正接触到区间DP的思想 d[i][j]:表示从第i个到到第j个人的最小值,那么第i个人可以是第一个出,也可以是最后一个出,假设是第k个出,则 区间可分为[i + 1, i + 1 + k - 1 - 1],d[i + k, j]前者肯定是在k之前出,后者在k之后,于是转换为区间DP问题 其中需要对后者做一下处理,加上(k - 1) * (sum[j] - s[i + k - 1])

883

G - You Are the One-区间dp

  G - You Are the One  HDU - 4283  想了好久才明白题意。 题意:有n个人排成一排要上台表演,每个人有一个屌丝值pi。第i个上台表演的人,他的不满意度为(i-1)*pi。 现在有一个栈类型的屋子。这些人要按照排的顺序来,那么对于排在最前面的人, 就有两个选择: (1)让他直接上台表演; (2)让他暂时进黑屋子。 思路:不可以是有规则的调整不可以...

BePosit的博客 215

HDU - 4283 You Are the One(记忆化搜索 * DP)

You Are the One  HDU - 4283  题意: 有n个男屌丝事先按1,2,3,,,,,,n的顺序排好,每个人都有一个不开心值unhappy[i],如果第i个人第k个上台找对象,那么该屌丝男的不开心值就会为(k-1)*unhappy[i],因为在他前面有k-1个人嘛,导演为了让所有男屌的总不开心值最小,搞了一个小黑屋,可以通

AI蜗牛之家 932

HDU 4283 You Are the One ——区间dp

dp[i][j]表示区间[i,j]的最小总不开心值 把区间[i,j]单独来看,则第i个人可以是第一个出场,也可以是最后一个出场,也可以是在中间出场,总之就是在【1,  j-i+1】出场 设他是第k个出场的(1 【i+1 ,i+k-1】内总共有k-1个人要比i先出栈; 【 i+k ,j】内 总共j-i-k+1个人在i后面出栈 举个例子: 有5个人事先排好顺序  1,2

hao_zong_yin的博客 475
上一篇: PAT (Advanced Level) Practise 1109. Group Photo (25) 结构体排序
下一篇: hdu2614 Beat BFS or DFS
Daemoonn
博客等级 码龄11年 42粉丝 198原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值