- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我得到了这个算法任务:
您将在下面输入一个三角形,您需要根据下面给定的规则找到数字的最大总和;
您只能走过非质数。
1
8 4
2 6 9
8 5 9 3
如您所见,它有几条符合非素数规则的路径; 1>8>6>9, 1>4>6>9, 1>4>9>91 + 8 + 6 + 9 = 24。如您所见,1、8、6、9 都不是质数,遍历这些数会得出最大和。
根据上述规则,以下输入的最大总和是多少?这意味着请将这个金字塔作为您的实现的输入(作为文件或直接在代码中的常量)并使用它来解决。
215
193 124
117 237 442
218 935 347 235
320 804 522 417 345
229 601 723 835 133 124
248 202 277 433 207 263 257
359 464 504 528 516 716 871 182
461 441 426 656 863 560 380 171 923
381 348 573 533 447 632 387 176 975 449
223 711 445 645 245 543 931 532 937 541 444
330 131 333 928 377 733 017 778 839 168 197 197
131 171 522 137 217 224 291 413 528 520 227 229 928
223 626 034 683 839 053 627 310 713 999 629 817 410 121
924 622 911 233 325 139 721 218 253 223 107 233 230 124 233
请注意,每个节点在这里只有两个子节点(最底部的节点除外)。例如,您可以从 215 走到 124(因为 193 是素数),然后从 124 走到 237 或 442。您不能从 124 走到 117,因为它不是 124 的直接子节点。
我知道有不同的方法可以解决这个问题
蛮力法
动态规划法
我使用动态规划方法是因为它的效率:
using System;
class Program
{
static void Main(string[] args)
{
//get input
var input = GetInput();
string[] arrayOfRowsByNewlines = input.Split('\n');
var tableHolder = FlattenTheTriangleIntoTable(arrayOfRowsByNewlines);
var result = WalkThroughTheNode(arrayOfRowsByNewlines, tableHolder);
Console.WriteLine($"The Maximum Total Sum Of Non-Prime Numbers From Top To Bottom Is: {result[0,0]}");
Console.ReadKey();
}
private static string GetInput()
{
const string input = @" 215
193 124
117 237 442
218 935 347 235
320 804 522 417 345
229 601 723 835 133 124
248 202 277 433 207 263 257
359 464 504 528 516 716 871 182
461 441 426 656 863 560 380 171 923
381 348 573 533 447 632 387 176 975 449
223 711 445 645 245 543 931 532 937 541 444
330 131 333 928 377 733 017 778 839 168 197 197
131 171 522 137 217 224 291 413 528 520 227 229 928
223 626 034 683 839 053 627 310 713 999 629 817 410 121
924 622 911 233 325 139 721 218 253 223 107 233 230 124 233";
return input;
}
private static int[,] WalkThroughTheNode(string[] arrayOfRowsByNewlines, int[,] tableHolder)
{
// walking through the non-prime node
for (int i = arrayOfRowsByNewlines.Length - 2; i >= 0; i--)
{
for (int j = 0; j < arrayOfRowsByNewlines.Length; j++)
{
//only sum through the non-prime node
if ((!IsPrime(tableHolder[i, j])))
{
tableHolder[i, j] = Math.Max(tableHolder[i, j] + tableHolder[i + 1, j],
tableHolder[i, j] + tableHolder[i + 1, j + 1]);
}
}
}
return tableHolder;
}
private static int[,] FlattenTheTriangleIntoTable(string[] arrayOfRowsByNewlines)
{
int[,] tableHolder = new int[arrayOfRowsByNewlines.Length, arrayOfRowsByNewlines.Length + 1];
for (int row = 0; row < arrayOfRowsByNewlines.Length; row++)
{
var eachCharactersInRow = arrayOfRowsByNewlines[row].Trim().Split(' ');
for (int column = 0; column < eachCharactersInRow.Length; column++)
{
int number;
int.TryParse(eachCharactersInRow[column], out number);
tableHolder[row, column] = number;
}
}
return tableHolder;
}
public static bool IsPrime(int number)
{
// Test whether the parameter is a prime number.
if ((number & 1) == 0)
{
if (number == 2)
{
return true;
}
return false;
}
for (int i = 3; (i * i) <= number; i += 2)
{
if ((number % i) == 0)
{
return false;
}
}
return number != 1;
}
}
谁能帮我检查一下代码,看看是否有更好的解决方法。
最佳答案
素数检查效率不高,但对于如此小的数字来说并不重要。您的动态规划方法很好,但是素数的逻辑存在错误。您只检查父节点是否为质数。因此,如果两个 child 都是素数,则父节点永远不会成为有效路径的一部分,但如果父节点不是素数,您仍然会提升两个素数中较大的一个 + 父值。如何修复:
在最低级别:如果一个数是质数,则将其设置为 -1。
在下一级:如果数字是质数或两个 child 都 < 0,则将其设置为 -1,否则像以前一样取数字 + child 的最大值。
如果顶部节点的值为 -1,则没有到底部的有效路径,否则它是最大路径的总和不踩素数。
关于c# - 最大路径总和在带质数校验的三角形中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44050547/
我基本上有三个表: hunt_c_usershunt_c_collected_eggshunt_c_achievements 我目前只使用 hunt_c_users 和 hunt_c_collecte
我已经计算了不同表中计数的总和。这会执行两次,每个 performanceID 一次。现在我想得到两个总和的总和。 下面是我目前做的两个总和的代码: SELECT SUM((COUNT (Bo
我有一个对 2 个值求和的脚本。我计划添加更多值(value),但首先我需要让它发挥作用。人们告诉我给他们 NUMBER 值,所以我这样做了,但现在它甚至没有给出输出。 base = 0; $("#F
我正在尝试计算在我们的数据库中跟踪的花费总额。每个订单文档包含一个字段“total_price” 我正在尝试使用以下代码: db.orders.aggregate({ $group: {
给定 Excel 2013(或更高版本)中的 2 个命名表: tbl发票 ID InvRef Total 1 I/123 45 2 I/234
希望你们一切都好。我来这里是因为我从今天早上开始就试图解决一个问题,我再也受不了了。 这就是上下文:我有一个 excel 工作簿,其中有不同的工作表,其中包含不同国家/地区的不同商业计划。我的目标是制
我有一份报告显示客户订购的产品及其价格: CompanyA Product 7 14.99 CompanyA Product 3 45.95 CompanyA Prod
我使用此python客户端: https://github.com/ryananguiano/python-redis-timeseries 如何汇总所有匹配? ts = TimeSeries(cli
希望创建一个总和和计数公式,该公式将自动调整以适应范围内插入的新行。 例如,如果我在单元格 D55 中有公式 =SUM(D17:D54)。每次我在该范围内插入新行时,我都需要更改公式的顶部范围来解释它
所以,我需要聚合日期相同的行。 到目前为止,我的代码返回以下内容: date value source 0 2018-04-08 15:52:26.1
我有数字输入 数量约为 30 我需要将它们全部汇总到一个字段 我拥有的在下面 查看:
您好,我正在尝试根据以下数据计算过去三个月中出现不止一次的不同帐户 ID 的数量;我想要 2 作为查询结果,因为 test1@gmail.com 和 test2@gmail.com 出现超过 1 次。
我有两个带有以下字段的表: ... orders.orderID orders.orderValue 和 payments.orderID payments.payVal 在 payments.pay
我想按 image_gallery 和 video_gallery 两列的 DESC 进行排序。 SELECT b.*, c.title as category, (S
实际上我的原始数据库为 SELECT sum(data1,data2) as database_value,sum(data3,data4) as database_not_value from t
我试图获取三个分数中每一个的值并将它们相加并显示在“总计:”中。我的问题是,我不知道如何做到这一点,以便每次其中一个分数值发生变化时,相应的总分值也会随之变化。 我可以在某处调用“onchange”来
如何获得按第一个值分组的元组列表中第二个和第三个值的总和? 即: list_of_tuples = [(1, 3, 1), (1, 2, 4), (2, 1, 0), (2, 2, 0)] expec
我正在尝试将我的列表中的整数转换为列表的总和和平均值,并说明任何低于冰点 F<32 的温度。每当我尝试获取总和或平均值时,我都会收到错误提示“+: 'int' 和 'str' 不支持的操作数类型”。我
在我的 ios 项目中,我使用了两个实体 (CoreData):具有一对多关系的 Person 和 Gifts 我知道如何计算给一个人的礼物总和: NSDecimalNumber *orderSum=
我有两个表(输入和类别): CREATE TABLE categories ( iId INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, sNam
我是一名优秀的程序员,十分优秀!