- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
假设我们有 n 个不相交的水平双杠。然后我们需要用一条垂直线连接每对条形,所以总共有 sum(n,...,1)
行。如果两个条之间的这些连接中的任何一个与其他条交叉 p 次,那么我们说成本是 p。问题是找出 n 根柱的最低总成本。
n=1, p=0: n=2, p=0: n=3, p=0 n=4, p=0:
--- -----
| | | | |
--- --- --- | --- | |
| | | | | | |
--- --- | --- |
| | |
-------
n=6, p=3:
-------------
| | | | |
| ----- | | |
| | | | | | |
| | | --- | |
| | | | | | |
--*-*-- | | |
| | | | |
| ----*-- |
| | | |
-----------
n=7, p=6:
---------------
| | | | | |
| --*---- | | |
| | | | | | | |
| | | --*-- | |
| | | | | | | |
| | --- | | | |
| | | | | | | |
| | | --*-*-- |
| | | | | | |
--*-*---- | |
| | | |
-------------
n=8, p=11
-------------------
| | | | | | |
| --1-1------ | | |
| | | | | | | |
| | --2---- | | | |
| | | | | | | | | |
| | | | | --1-- | |
| | | | | | | | | |
| | | --1-- | | | |
| | | | | | | | |
| | | | ----1-1-- |
| | | | | | | |
--1-1-1------ | |
| | | | |
-----------------
任何关于如何找到其背后的模式或逻辑的提示都会很棒。
1 Câu trả lời
这是一个使用蛮力解决问题的草稿解决方案假设可以在只有 n+1 列的网格中找到 n 个柱的最佳解决方案(这个假设至少对于 n 个似乎是错误的>=8。通过更改参数可以扩展搜索,最坏情况是 sum(n-1, ... 1),但这将进一步减慢搜索速度,主要是通过添加冗余解决方案)。
该算法具有指数级的复杂性,并且只会在有用时间内给出非常小的数字的结果。正如我在评论中所说,这种方法可以通过减少搜索空间来有所改进,只允许具有沙钟形状的条形组合(外面的长条,里面的短条,最外面的条最长,覆盖相同的空间,以及所有其他条可以放在最外面的列内)。但是到目前为止,我没有发现其他有用的属性可以使用。请注意,可能存在某些仅适用于某些最佳解决方案的属性,例如中心条的长度为 2。
更好的方法可能是使用 sum(n-1, ... 1) 列,每个连接都有自己的列,变体的数量实际上可能会更少。
是否存在有用的动态规划解决方案,我不知道。
public class BarConnection {
static class Bar {
int start, end;
private final int maxlength, minlength;
Bar(int maxlength, int minlength) {
this.maxlength = maxlength;
this.minlength = minlength;
reset();
}
public boolean next() {
start++;
if (start > 0) {
return reset((end - start) + 2);
}
end++;
trả về giá trị đúng;
}
public void reset() {
reset(minlength);
}
public boolean reset(int length) {
if (length > maxlength) {
trả về false;
}
start = -length;
end = 0;
trả về giá trị đúng;
}
}
static class Solution {
private Bar[] bars;
private int globalmin, globalmax, cost;
Solution(int n) {
bars = new Bar[n];
for (int i = 0; i < n; i++) {
bars[i] = new Bar(/* maxlength */ n, /* minlength */ 1);
}
}
private boolean connect(final int maxcost) {
cost = Integer.MAX_VALUE;
int sumcost = 0;
for (int i = 0; i < (bars.length - 1); i++) {
for (int j = i + 1; j < bars.length; j++) {
final int pairCost = minCostBetween(i, j);
if (pairCost == 0) {
continue;
}
sumcost += pairCost;
if (sumcost > maxcost) {
trả về false;
}
}
}
cost = sumcost;
trả về giá trị đúng;
}
boolean nextSolution(final int maxcost) {
while (true) {
while (bars[0].next()) {
if (connect(maxcost)) {
trả về giá trị đúng;
}
}
bars[0].reset();
for (int i = 1; i < bars.length; i++) {
if (bars[i].next()) {
phá vỡ;
}
if (i == bars.length - 1) {
trả về false;
}
bars[i].reset();
}
if (connect(maxcost)) {
trả về giá trị đúng;
}
}
}
private int minCostBetween(final int i, final int j) {
int minConnectionCost = -1;
for (int k = Math.max(bars[i].start, bars[j].start); k <=
Math.min(bars[i].end, bars[j].end); k++) {
// calculate cost for connecting at column k
int newcost = 0;
for (int l = i + 1; l < j; l++) {
final Bar midbar = bars[l];
if ((k >= midbar.start) && (k <= midbar.end)) {
newcost++;
if ((minConnectionCost >= 0) && (newcost >=
minConnectionCost)) {
phá vỡ;
}
}
}
if ((minConnectionCost < 0) || (newcost < minConnectionCost)) {
minConnectionCost = newcost;
if (newcost == 0) {
phá vỡ;
}
}
}
return minConnectionCost;
}
}
public static void main(String[] args) {
int n = 6
final Solution searchState = new Solution(n);
int minCost = Integer.MAX_VALUE;
while(true) {
if (!searchState.nextSolution(minCost - 1)) {
phá vỡ;
}
minCost = searchState.cost, minCost;
if (minCost == 0) {
phá vỡ;
}
}
System.out.println("n=" + n + ", p=" + minCost);
}
}
关于java - 最少穿过 N 条平行线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58316038/
我看到以下宏 here . static const char LogTable256[256] = { #define LT(n) n, n, n, n, n, n, n, n, n, n, n,
Câu hỏi này khó có thể giúp ích cho bất kỳ du khách nào trong tương lai; nó chỉ liên quan đến một khu vực địa lý nhỏ, một thời điểm cụ thể hoặc một tình huống rất hẹp không áp dụng chung cho toàn bộ đối tượng sử dụng Internet. Để giúp câu hỏi này có thể áp dụng rộng rãi hơn, hãy truy cập
所以我得到了这个算法我需要计算它的时间复杂度 这样的 for i=1 to n do k=i while (k<=n) do FLIP(A[k]) k
n 的 n 次方(即 n^n)是多项式吗? T(n) = 2T(n/2) + n^n 可以用master方法求解吗? 最佳答案 它不仅不是多项式,而且比阶乘还差。 O(n^n) 支配 O(n!)。同样
我正在研究一种算法,它可以在带有变音符号的字符(tilde、circumflex、caret、umlaut、caron)及其“简单”字符之间进行映射。 例如: ń ǹ ň ñ ṅ ņ ṇ
嗯..我从昨天开始学习APL。我正在观看 YouTube 视频,从基础开始学习各种符号,我正在使用 NARS2000。 我想要的是打印斐波那契数列。我知道有好几种代码,但是因为我没有研究过高深的东西,
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭12 年前。 Improve th
谁能帮我从 N * N * N → N 中找到一个双射数学函数,它接受三个参数 x、y 和 z 并返回数字 n? 我想知道函数 f 及其反函数 f',如果我有 n,我将能够通过应用 f'(n) 来
场景: 用户可以在字符串格式的方程式中输入任意数量的括号对。但是,我需要检查以确保所有括号 ( 或 ) 都有一个相邻的乘数符号 *。因此 3( 应该是 3*( 和 )3 应该是 )*3。 我需要将所有
在 Java 中,表达式: n+++n 似乎评估为等同于: n++ + n 尽管 +n 是一个有效的一元运算符,其优先级高于 n + n 中的算术 + 运算符。因此编译器似乎假设运算符不能是一元运算符
当我阅读 this 问题我记得有人曾经告诉我(很多年前),从汇编程序的角度来看,这两个操作非常不同: n = 0; n = n - n; 这是真的吗?如果是,为什么会这样? 编辑: 正如一些回复所指出
我正在尝试在reveal.js 中加载外部markdown 文件,该文件已编写为遵守数据分隔符语法: You can write your content as a separate file and
我试图弄清楚如何使用 Javascript 生成一个随机 11 个字符串,该字符串需要特定的字母/数字序列,以及位置。 ----------------------------------------
我最近偶然发现了一个资源,其中 2T(n/2) + n/log n 类型 的递归被 MM 宣布为无法解决。 直到今天,当另一种资源被证明是矛盾的(在某种意义上)时,我才接受它作为引理。 根据资源(下面
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
我完成的一个代码遵循这个模式: for (i = 0; i < N; i++){ // O(N) //do some processing... } sort(array, array + N
有没有办法证明 f(n) + g(n) = theta(n^2) 还是不可能?假设 f(n) = theta(n^2) & g(n) = O(n^2) 我尝试了以下方法:f(n) = O(n^2) &
所以我目前正在尝试计算我拥有的一些数据的 Pearson R 和 p 值。这是通过以下代码完成的: import numpy as np from scipy.stats import pearson
ltree 列的默认排序为文本。示例:我的表 id、parentid 和 wbs 中有 3 列。 ltree 列 - wbs 将 1.1.12, 1.1.1, 1.1.2 存储在不同的行中。按 wbs
我的目标是编写一个程序来计算在 python 中表示数字所需的位数,如果我选择 number = -1 或任何负数,程序不会终止,这是我的代码: number = -1 cnt = 0 while(n
Tôi là một lập trình viên xuất sắc, rất giỏi!