Project Euler 题解 #18 #67 Maximum path sum

2024-04-06 05:38

本文主要是介绍Project Euler 题解 #18 #67 Maximum path sum,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:Maximum path sum I    Maximum path sum II

By starting at the top of the triangle below and moving to adjacent numbers on the row below, the maximum total from top to bottom is 23.

3
7 4
2 4 6
8 5 9 3

That is, 3 + 7 + 4 + 9 = 23.

Find the maximum total from top to bottom in triangle.txt, a 15K text file containing a triangle with one-hundred rows.

这道题实质为路径搜索,可以用动态规划解决,但不能用暴力搜索。

数学描述

取层数为N,规模数为2N

这里采用"层降法"思想,O(N) = N2

具体如下:

当处理到最后一层时,遍历一遍即可得到最大值。

由于一层一层的处理,那么代码实现时可以不用存储所有的数据,只需存储相邻的两层。

代码实现

//https://projecteuler.net/problem=18
//Maximum path sum I
//https://projecteuler.net/problem=67
//Maximum path sum II
#include "stdafx.h"
#include <iostream>
#include <memory>
#include <fstream>
#include <iomanip>
using namespace std;
#define MAX(a,b) ((a)>(b)? (a) : (b))
int _tmain(int argc, _TCHAR* argv[])
{
int N = 15; //数据的层数
int *old_line = new int[N];
int *new_line = new int[N];
memset(old_line, 0, N*sizeof(int));
memset(new_line, 0, N*sizeof(int));
fstream file("triangle.txt");
for (int i = 0; i< N; ++i)
{
for (int j = 0; j <= i; ++j)
{
file>>new_line[j];
cout<<setw(2)<<setfill('0')<<new_line[j]<<"  ";
if (i == 0 && j == 0)
{
continue;
}
else if (i > 0 && j == 0)
{
new_line[j] += old_line[j];
}
else if (i > 0 && j == i)
{
new_line[j] += old_line[j - 1];
}
else
{
new_line[j] += MAX(old_line[j-1], old_line[j]);
}
}
cout<<endl;
memcpy_s(old_line, N*sizeof(int), new_line, N*sizeof(int));
memset(new_line, 0, N*sizeof(int));
}
file.close();
int max_sum = 0;
for (int i = 0; i < N; ++i)
{
if (old_line[i] > max_sum)
{
max_sum = old_line[i];
}
}
cout<<"Max path sum = "<<max_sum<<endl;
delete old_line;
delete new_line;
system("pause");
return 0;
}

输入:

N = 15

75
95 64
17 47 82
18 35 87 10
20 04 82 47 65
19 01 23 75 03 34
88 02 77 73 07 63 67
99 65 04 28 06 16 70 92
41 41 26 56 83 40 80 70 33
41 48 72 33 47 32 37 16 94 29
53 71 44 65 25 43 91 52 97 51 14
70 11 33 28 77 73 17 78 39 68 17 57
91 71 52 38 17 14 91 43 58 50 27 29 48
63 66 04 68 89 53 67 30 73 16 69 87 40 31
04 62 98 27 23 09 70 98 73 93 38 53 60 04 23

输出:

这篇关于Project Euler 题解 #18 #67 Maximum path sum的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/879130

相关文章

idea中project的显示问题及解决

《idea中project的显示问题及解决》:本文主要介绍idea中project的显示问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录idea中project的显示问题清除配置重China编程新生成配置总结idea中project的显示问题新建空的pr

PyTorch中cdist和sum函数使用示例详解

《PyTorch中cdist和sum函数使用示例详解》torch.cdist是PyTorch中用于计算**两个张量之间的成对距离(pairwisedistance)**的函数,常用于点云处理、图神经网... 目录基本语法输出示例1. 简单的 2D 欧几里得距离2. 批量形式(3D Tensor)3. 使用不

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring

解决jupyterLab打开后出现Config option `template_path`not recognized by `ExporterCollapsibleHeadings`问题

《解决jupyterLab打开后出现Configoption`template_path`notrecognizedby`ExporterCollapsibleHeadings`问题》在Ju... 目录jupyterLab打开后出现“templandroidate_path”相关问题这是 tensorflo

解读静态资源访问static-locations和static-path-pattern

《解读静态资源访问static-locations和static-path-pattern》本文主要介绍了SpringBoot中静态资源的配置和访问方式,包括静态资源的默认前缀、默认地址、目录结构、访... 目录静态资源访问static-locations和static-path-pattern静态资源配置

Python实现数据清洗的18种方法

《Python实现数据清洗的18种方法》本文主要介绍了Python实现数据清洗的18种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录1. 去除字符串两边空格2. 转换数据类型3. 大小写转换4. 移除列表中的重复元素5. 快速统

python中os.stat().st_size、os.path.getsize()获取文件大小

《python中os.stat().st_size、os.path.getsize()获取文件大小》本文介绍了使用os.stat()和os.path.getsize()函数获取文件大小,文中通过示例代... 目录一、os.stat().st_size二、os.path.getsize()三、函数封装一、os

最大流=最小割=最小点权覆盖集=sum-最大点权独立集

二分图最小点覆盖和最大独立集都可以转化为最大匹配求解。 在这个基础上,把每个点赋予一个非负的权值,这两个问题就转化为:二分图最小点权覆盖和二分图最大点权独立集。   二分图最小点权覆盖     从x或者y集合中选取一些点,使这些点覆盖所有的边,并且选出来的点的权值尽可能小。 建模:     原二分图中的边(u,v)替换为容量为INF的有向边(u,v),设立源点s和汇点t

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &