- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我对下面的问题理解起来比较困难,如果有人能帮助我理解它,我将不胜感激。问题是:
Implement a dynamic programming algorithm for solving the following
problem. The input is an n × n matrix of integers. For the output:
compute the largest sum of adjacent entries in horizontal, vertical,
diagonal and anti-diagonal direction. Return as output the sum
h + v + d + c (in suggestive notation) of those four auxiliary results.
The largest (or maximal) sum of an array consisting of only negative
integers is 0; that is, in that case we select the empty subarray.
A (small) example input matrix with solution 45:
|-2 5 3 2|
|9 -6 5 3|
|1 -8 2 -3|
|-1 2 -5 2|
我的意思是如果有人能帮助我朝着正确的方向前进,我将非常感激!!!谢谢
最佳答案
鉴于您的问题陈述:
Implement a dynamic programming algorithm for solving the following problem. The input is an n × n matrix of integers. For the output: compute the largest sum of adjacent entries in horizontal, vertical, diagonal and anti-diagonal direction. Return as output the sum h + v + d + c (in suggestive notation) of those four auxiliary results. The largest (or maximal) sum of an array consisting of only negative
integers is 0; that is, in that case we select the empty subarray. A (small) example input matrix with solution 45:
|-2 5 3 2|
|9 -6 5 3|
|1 -8 2 -3|
|-1 2 -5 2|
然后,阅读您发布的示例输入,我做了一个从文件中解析该信息的简短方法:
public static List<List<Integer>> readFile(final String path) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
Path p = Paths.get(path);
if (!Files.exists(p))
return null;
List<String> lines = null;
try {
lines = Files.readAllLines(p);
} catch (IOException e) {
e.printStackTrace();
}
if (lines == null)
return null;
for (String str : lines) {
List<Integer> row = new ArrayList<Integer>();
final String line = str.substring(1, str.length() - 1);
String[] arr = line.split(" ");
for (String s : arr)
row.add(Integer.valueOf(s.trim()));
result.add(row);
}
return result;
}
垂直方法很简单,遍历嵌套数组。
public static int getVertical(final List<List<Integer>> list) {
int result = 0;
for (List<Integer> arr : list) {
int curr = 0;
for (Integer val : arr)
curr += val;
if (curr > result)
result = curr;
}
return result;
}
水平方向也很直接。注意:为了简单起见,我在这里只使用了一个计数器列表。有更有效的方法。
public static int getHorizontal(final List<List<Integer>> list, final int len) {
List<Integer> sums = new ArrayList<Integer>(list.get(0));
for (int i = 1; i < len; ++i)
for (int j = 0; j < len; ++j)
sums.set(j, sums.get(j) + list.get(i).get(j));
return Collections.max(sums);
}
我快速搜索找到诊断/反诊断循环 question .此代码有助于适应整数值(来自字符串/println 的)并产生以下两种方法。注意:debug/system.out.println 用于帮助/显示。
public static int getDiagonal(final List<List<Integer>> list, final int len) {
int result = 0;
// [top half]
for (int i = len - 1; i > 0; --i) {
//String temp = "";
int tmp = 0;
for (int j = 0, x = i; x <= len - 1; ++j, ++x) {
final int val = list.get(x).get(j);
//temp = temp + " " + val;
tmp += val;
}
//System.out.println(temp);
if (tmp > result)
result = tmp;
}
// [lower half]
for (int i = 0; i <= len - 1; ++i) {
//String temp = "";
int tmp = 0;
for (int j = 0, y = i; y <= len - 1; ++j, ++y) {
final int val = list.get(j).get(y);
//temp = temp + " " + val;
tmp += val;
}
//System.out.println(temp);
if (tmp > result)
result = tmp;
}
return result;
}
public static int getAntiDiagonal(final List<List<Integer>> list, final int len) {
int result = 0;
// [top half]
for (int k = 0; k < len; ++k) {
int tmp = 0;
for (int j = 0; j <= k; ++j) {
int i = k - j;
int val = list.get(i).get(j);
//System.out.print(val + " ");
tmp += val;
}
if (tmp > result)
result = tmp;
//System.out.println();
}
// [lower half]
for (int k = len - 2; k >= 0; --k) {
int tmp = 0;
for (int j = 0; j <= k; ++j) {
int i = k - j;
int val = list.get(len - j - 1).get(len - i - 1);
//System.out.print(val + " ");
tmp += val;
}
if (tmp > result)
result = tmp;
//System.out.println();
}
return result;
}
这是解决原始问题的整个程序的最终结果:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class App {
public static void main(String[] args) {
List<List<Integer>> data = readFile("C:\\Users\\Nick\\Desktop\\test.txt");
for (List<Integer> row : data)
System.out.println(row);
final int n = data.size();
int maxVertical = getVertical(data);
int maxHorizontal = getHorizontal(data, n);
int maxDiagonal = getDiagonal(data, n);
int maxAntiDiagonal = getAntiDiagonal(data, n);
System.out.println("max vertical = " + maxVertical);
System.out.println("max horizontal = " + maxHorizontal);
System.out.println("max diagonal = " + maxDiagonal);
System.out.println("max anti-diagonal = " + maxAntiDiagonal);
}
public static int getVertical(final List<List<Integer>> list) {
int result = 0;
for (List<Integer> arr : list) {
int curr = 0;
for (Integer val : arr)
curr += val;
if (curr > result)
result = curr;
}
return result;
}
public static int getHorizontal(final List<List<Integer>> list, final int len) {
List<Integer> sums = new ArrayList<Integer>(list.get(0));
for (int i = 1; i < len; ++i)
for (int j = 0; j < len; ++j)
sums.set(j, sums.get(j) + list.get(i).get(j));
return Collections.max(sums);
}
public static int getDiagonal(final List<List<Integer>> list, final int len) {
int result = 0;
// [top half]
for (int i = len - 1; i > 0; --i) {
int tmp = 0;
for (int j = 0, x = i; x <= len - 1; ++j, ++x) {
final int val = list.get(x).get(j);
tmp += val;
}
if (tmp > result)
result = tmp;
}
// [lower half]
for (int i = 0; i <= len - 1; ++i) {
int tmp = 0;
for (int j = 0, y = i; y <= len - 1; ++j, ++y) {
final int val = list.get(j).get(y);
tmp += val;
}
if (tmp > result)
result = tmp;
}
return result;
}
public static int getAntiDiagonal(final List<List<Integer>> list, final int len) {
int result = 0;
// [top half]
for (int k = 0; k < len; ++k) {
int tmp = 0;
for (int j = 0; j <= k; ++j) {
int i = k - j;
int val = list.get(i).get(j);
tmp += val;
}
if (tmp > result)
result = tmp;
}
// [lower half]
for (int k = len - 2; k >= 0; --k) {
int tmp = 0;
for (int j = 0; j <= k; ++j) {
int i = k - j;
int val = list.get(len - j - 1).get(len - i - 1);
tmp += val;
}
if (tmp > result)
result = tmp;
}
return result;
}
public static List<List<Integer>> readFile(final String path) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
Path p = Paths.get(path);
if (!Files.exists(p))
return null;
List<String> lines = null;
try {
lines = Files.readAllLines(p);
} catch (IOException e) {
e.printStackTrace();
}
if (lines == null)
return null;
for (String str : lines) {
List<Integer> row = new ArrayList<Integer>();
final String line = str.substring(1, str.length() - 1);
String[] arr = line.split(" ");
for (String s : arr)
row.add(Integer.valueOf(s.trim()));
result.add(row);
}
return result;
}
}
最后,假设 test.txt 文件包含:
|-2 5 3 2|
|9 -6 5 3|
|1 -8 2 -3|
|-1 2 -5 2|
输出结果(应该是)是:
[-2, 5, 3, 2]
[9, -6, 5, 3]
[1, -8, 2, -3]
[-1, 2, -5, 2]
max vertical = 11
max horizontal = 7
max diagonal = 7
max anti-diagonal = 14
干杯
编辑我意识到我在技术上没有完全回答原始问题,所以:
将这两行添加到 main() 方法的最后
int result = maxVertical + maxHorizontal + maxDiagonal + maxAntiDiagonal;System.out.println("结果 = "+ 结果);
为每个相应的方法(vert/horiz/diag/anti-diag)添加检查,以便在问题中陈述负面事件的情况
The largest (or maximal) sum of an array consisting of only negative integers is 0; that is, in that case we select the empty subarray
也可以被覆盖。这不是一个巨大的代码检修,而是一个独特的检查。
关于java - n x n 整数矩阵求最大和的动态规划算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39987016/
问题故障解决记录 -- Java RMI Connection refused to host: x.x.x.x .... 在学习JavaRMI时,我遇到了以下情况 问题原因:可
我正在玩 Rank-N-type 并尝试输入 x x .但我发现这两个函数可以以相同的方式输入,这很不直观。 f :: (forall a b. a -> b) -> c f x = x x g ::
这个问题已经有答案了: How do you compare two version Strings in Java? (31 个回答) 已关闭 8 年前。 有谁知道如何在Java中比较两个版本字符串
这个问题已经有答案了: How do the post increment (i++) and pre increment (++i) operators work in Java? (14 个回答)
下面是带有 -n 和 -r 选项的 netstat 命令的输出,其中目标字段显示压缩地址 (127.1/16)。我想知道 netstat 命令是否有任何方法或选项可以显示整个目标 IP (127.1.
我知道要证明 : (¬ ∀ x, p x) → (∃ x, ¬ p x) 证明是: theorem : (¬ ∀ x, p x) → (∃ x, ¬ p x) := begin intro n
x * x 如何通过将其存储在“auto 变量”中来更改?我认为它应该仍然是相同的,并且我的测试表明类型、大小和值显然都是相同的。 但即使 x * x == (xx = x * x) 也是错误的。什么
假设,我们这样表达: someIQueryable.Where(x => x.SomeBoolProperty) someIQueryable.Where(x => !x.SomeBoolProper
我有一个字符串 1234X5678 我使用这个正则表达式来匹配模式 .X|..X|X. 我得到了 34X 问题是为什么我没有得到 4X 或 X5? 为什么正则表达式选择执行第二种模式? 最佳答案 这里
我的一个 friend 在面试时遇到了这个问题 找到使该函数返回真值的 x 值 function f(x) { return (x++ !== x) && (x++ === x); } 面试官
这个问题在这里已经有了答案: 10年前关闭。 Possible Duplicate: Isn't it easier to work with foo when it is represented b
我是 android 的新手,我一直在练习开发一个针对 2.2 版本的应用程序,我需要帮助了解如何将我的应用程序扩展到其他版本,即 1.x、2.3.x、3 .x 和 4.x.x,以及一些针对屏幕分辨率
为什么案例 1 给我们 :error: TypeError: x is undefined on line... //case 1 var x; x.push(x); console.log(x);
代码优先: # CASE 01 def test1(x): x += x print x l = [100] test1(l) print l CASE01 输出: [100, 100
我正在努力温习我的大计算。如果我有将所有项目移至 'i' 2 个空格右侧的函数,我有一个如下所示的公式: (n -1) + (n - 2) + (n - 3) ... (n - n) 第一次迭代我必须
给定 IP 字符串(如 x.x.x.x/x),我如何或将如何计算 IP 的范围最常见的情况可能是 198.162.1.1/24但可以是任何东西,因为法律允许的任何东西。 我要带198.162.1.1/
在我作为初学者努力编写干净的 Javascript 代码时,我最近阅读了 this article当我偶然发现这一段时,关于 JavaScript 中的命名空间: The code at the ve
我正在编写一个脚本,我希望避免污染 DOM 的其余部分,它将是一个用于收集一些基本访问者分析数据的第 3 方脚本。 我通常使用以下内容创建一个伪“命名空间”: var x = x || {}; 我正在
我尝试运行我的test_container_services.py套件,但遇到了以下问题: docker.errors.APIError:500服务器错误:内部服务器错误(“ b'{” message
是否存在这两个 if 语句会产生不同结果的情况? if(x as X != null) { // Do something } if(x is X) { // Do something } 编
我是一名优秀的程序员,十分优秀!