- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
问题描述(为方便起见在此处引用):
For a sequence of N integers, A1, A2, ..... AN
We can calculate the stability factor P, as
P = sum of all (abs(Ai-Ai-1)*C[i]) where 2 <= i <= N
C[i] is the cost of putting a number at position i
Your task is find the minimum P for the given N numbers considering all the different permutations of them.
关于解决此问题的一般方法,我只需要朝着正确的方向轻推。 (欢迎使用少量伪代码,但我有信心在整个算法大体清晰后编写出一个解决方案)
我已经考虑了很长一段时间,但我仍然无法找到满足该问题约束的任何解决方案 (N <= 15) 蛮力方法似乎只在 N= 时表现良好10 真的。
首先,对于最大可能的测试用例 N=15,我不相信您能够枚举并考虑所有 15 个!排列以便在足够好的时间找到你的答案,因为复杂性类不允许这样做。
所以我们需要做几个简化的假设来减少这个搜索空间。这就是我被困的地方。或者它可能只是归结为一种更智能的方式来开始遍历这个排列空间?
我尝试使用动态编程来解决这个问题,因为排列共享许多公共(public)位,这些位可以预先计算(内存)并在必要时存储和重用,例如。 A[] = 123456 & A[] = 123465 两者都会给出 1234- 的相同部分和,但这没有成功,因为你仍然必须经过 15!排列,并且会在那之前 TLE 方式,所以这不好。
另一个想法是处理连续 A 与 C[] 的所有元素之间的差异的所有可能排列,并首先找到将产生最小 abs(A[i]-A[j])* 的对所有这些中的 C[k] 值,分配那些并将它们标记为已使用,然后继续 i 或 j 中的一个以形成下一对,再次迭代并重复。这应该在多项式时间内完成(我猜大约是 n^3),但对于某些示例,该假设不成立。
我不认为这个问题应该很难将其转化为某种图问题 - 其中 A[i]、A[j] 形成节点,C[k] 是边链接的成本这些节点,或者可能是一些 bool SAT 问题……所有这些似乎都走错了路。
如果您用谷歌搜索这个问题,除了托管此问题的 SPOJ 网站外,您可能几乎找不到任何与此问题相关的内容。
非常感谢。
最佳答案
可以用一个O(n*2^n)空间,O(n^2*n^2)时间的子集动态规划算法来求解。
关键的见解是,当您从左到右构建最佳解决方案时,只有先前放置的数字和使用的子集很重要,而不是事物在使用的子集中放置的顺序。
计算与 Travelling Salesman Problem. 的解决方案具有基本相同的结构
您的 DP 想法走在了正确的轨道上。洞察只是所有这些部分路径之后的最优路径是相同的
1235
1325
2135
2315
3125
3215
因此您实际上不需要探索所有可能的排列,只需探索那些具有最佳部分路径的排列即可。
这里是一些实现所描述算法的 TLE Python 代码,但由于 Python 中的常数因子减速而失败。我转换为 C++ 并获得了 AC。
global A
global C
A = []
C = []
def Solve(used, last, cache):
if (used, last) in cache:
return cache[(used, last)]
cur_pos = len(used)
if cur_pos == len(A):
return 0
mn = 1e10
for idx in range(len(A)):
if not idx in used:
next_used = used.union([idx])
subcost = Solve(next_used, A[idx], cache)
additional = C[cur_pos] * abs(last - A[idx])
mn = min(mn, subcost + additional)
cache[(used, last)] = mn
return mn
T = int(raw_input())
for i in range(T):
N = int(raw_input())
A = map(int, raw_input().split())
C = map(int, raw_input().split())
cache = {}
print min(Solve(frozenset([idx]), A[idx], cache) for idx in range(len(A)))
关于algorithm - SPOJ 问题集(经典): 9386. 重新排列 II #[MAIN112],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7276291/
本文实例总结了常用SQL语句优化技巧。分享给大家供大家参考,具体如下: 除了建立索引之外,保持良好的SQL语句编写习惯将会降低SQL性能问题发生。 ①通过变量的方式来设置参数 好:
写CSS的同学们往往会体会到,随着项目规模的增加,项目中的CSS代码也会越来越多,如果没有及时对CSS代码进行维护,CSS代码不断会越来越多。CSS代码交错复杂,像一张庞大的蜘蛛网分布在网站的各个位
所以我必须解决类的背包问题。到目前为止,我想出了以下内容。我的比较器是确定两个主题中哪一个是更好选择的函数(通过查看相应的(值,工作)元组)。 我决定迭代工作量小于 maxWork 的可能主题,并且为
前言:复杂类型说明 要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级
代码如下: 复制代码代码如下: USE [tempdb] GO /****** Object: UserDefinedFunction [dbo].[fun
最近收到一个工作要求,让我完成一个每天一次的Linux服务器巡检工作(服务器的版本为红帽6.4),不可以使用监控软件来操作。在这里,把我的巡检过程和巡检脚本放送给大家做一参考。 首先,巡检内容
可以在 Classic ASP 中动态创建“空”对象并创建对象属性吗? 以这个 JavaScript 示例为例: var sample = new Object(); sample.prop = "O
我正在向旧的经典 asp 站点添加功能,但遇到了一个有趣的问题。页面上的以下行导致有用的错误“需要对象:''” strServerName = Request.ServerVariables("ser
我有一个经典的 ASP 应用程序,我正在处理日期截止。我的服务器位于中部时间,但我在东部时间。发生的情况是我的应用程序认为它早了一个小时,而我的截止时间晚了一个小时。我敢肯定,如果用户在太平洋时间,他
我是经典 ASP 的初学者。需要拆分一个由逗号分隔的许多电子邮件组成的字符串,并使用稍后生成的附加代码将结果插入(逐个电子邮件)到表格中。每条记录都应该有一个电子邮件地址。问题是我陷入了数组范围错误。
这个问题已经有答案了: one condition, multiple events (2 个回答) 已关闭 6 年前。 如何用更小的语句替换 1,2,3..。我尝试将 1 放入 10,但显示错误。
我是 ExtJS 的新手,所以我不知道是否可能。 Google 只回答如何为图表制作工具提示,所以... 我需要制作一个带有工具提示的网格,当用户将鼠标放在单元格上时将显示该工具提示。在该工具提示中,
我正在使用一个非常奇怪的 VB 版本...它不需要我告诉它什么是什么,它想自己弄清楚。 在 C# 中,我可以轻松地对数组进行硬编码...在 VB 中则不然。 我想在调用函数时创建一个硬编码数组...但
我的数据库访问代码如下: set recordset = Server.CReateObject("ADODB.Recordset") set cmd1 = Server.CreateObject(
我有 html 按钮和文本框的代码:文本框是我输入文本的地方,以便我可以在表格上进行一些更改。 'textbox " /> 'button Clear 我现在需要做的是单击“清除”按
我有一个表单,提交后会通过电子邮件发送。该表单使用 JavaScript 进行验证。经典 ASP 处理表单,即获取输入的数据、创建然后发送电子邮件。有报道称正在提交空白表格。仅发送标题和 Logo 。
加载页面 A.asp 默认情况下正在执行,从那里开始执行电子邮件的情况,如果是电子邮件,我们将调用页面 B。我想在控件被执行时执行相同的电子邮件情况从页面 B 转移到页面 A。请帮助我。 Page A
我正在使用经典 ASP 开发一个项目,例如,我想添加一些用户作为临时列表,当我提交表单时,这些数据将保存到数据库中。 我知道如何在 asp.net 中使用它,但不知道如何在经典 asp 中使用它。 例
我有一个带有简单 html 表的经典 ASP 页面,我想根据从数据库中提取的未知数量的记录循环表行,但是,当我使用 do/while 循环循环记录时,我收到一条错误消息,指出 Either BOF o
嘿,一直在寻找一段时间,但我似乎找不到任何有关如何在经典 asp 中处理日期的信息。 现在,我需要一种方法来计算今年过去的天数。我正在考虑一个简单的函数,它将获取当前日期,然后使用 (day = 1,
我是一名优秀的程序员,十分优秀!