Description

7
3 8
8 1 0
2 7 4 4
4 5 2 6 5 (Figure 1)

Figure 1 shows a number triangle. Write a program that calculates the highest sum of numbers passed on a route that starts at the top and ends somewhere on the base. Each step can go either diagonally down to the left or diagonally down to the right. 

Input

Your program is to read from standard input. The first line contains one integer N: the number of rows in the triangle. The following N lines describe the data of the triangle. The number of rows in the triangle is > 1 but <= 100. The numbers in the triangle, all integers, are between 0 and 99.

Output

Your program is to write to standard output. The highest sum is written as an integer.

Sample Input

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

Sample Output

30
题目大意:求出三角形的最大和,规定路径从第一行第一个为起点,路径为向下一行的该列或者下一行的右边的一列(在所有数字向左对齐的情况下),终点为最后一行的某个数。
解题思路:这是一道dp教程中十分常见的入门题,在解这道题目我们要尽量防止回溯,因为很有可能会超时(实际上也超了),所以我们十分需要用一个数组来储存过程中计算得到的结果,在代码里面我定义为dp数组,dp[i][j]表示从倒数第一排开始走到i排j列的最大和,如果输入是样例输入的话,那么dp数组应该是这样的。
30
23 21
20 13 10
7 12 10 10
4 5 2 6 5
(其余为0)
递归代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define MAXN 100
using namespace std;
int map[MAXN + 5][MAXN + 5];
int dp[MAXN + 5][MAXN + 6];
int n;
int sum; int maxsum(int x, int y)
{
if(dp[x][y] != -1)//dp[x][y]!=-1表示已经计算了,不必再算
return dp[x][y]; if(x == n)//x==n表示最后一行,最小和为map[x][y]他本身
{
dp[x][y] = map[x][y];
}
else
{
int i = maxsum(x + 1, y);
int j = maxsum(x + 1, y + 1);
dp[x][y] = max(i, j) + map[x][y];
}
return dp[x][y];
} int main()
{
cin >> n;
for(int i = 1; i <= n; i ++)
{
for(int j = 1; j <= i; j ++)
{
scanf("%d", &map[i][j]);
dp[i][j] = -1;
}
}
cout << maxsum(1, 1) << endl;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= i; j ++)
{
cout << dp[i][j] << ' ';
}
cout << endl;
}
return 0;
}
/*
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
ans:30
*/

递推代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define MAXN 100
using namespace std;
int map[MAXN + 5][MAXN + 5];
int dp[MAXN + 5][MAXN + 6];
int n;
int sum; int main()
{
cin >> n;
for(int i = 1; i <= n; i ++)
{
for(int j = 1; j <= i; j ++)
{
scanf("%d", &map[i][j]);
}
} for(int i = 1; i <= n; i ++)//最后一行的最大和是最后一行的数字本身
dp[n][i] = map[n][i]; for(int i = n - 1; i >= 1; i --)//从最后一排到第一排
{
for(int j = 1; j <= i; j ++)
{
dp[i][j] = max(dp[i + 1][j], dp[i + 1][j + 1]) + map[i][j];
}
}
cout << dp[1][1] << endl;
return 0;
}
/*
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
ans:30
*/

递推代码的空间优化:

空间优化的思路:将dp从二维转换为一维很明显能节省很多空间,dp[i]这时候表示第一行i列为终点的最大和
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define MAXN 100
using namespace std;
int map[MAXN + 5][MAXN + 5];
int dp[MAXN + 5];
int n;
int sum; int main()
{
cin >> n;
for(int i = 1; i <= n; i ++)
{
for(int j = 1; j <= i; j ++)
{
scanf("%d", &map[i][j]);
}
}
for(int i = 1; i <= n; i ++)//最后一行的最大和是最后一行的数字本身
{
dp[i] = map[n][i];
}
for(int i = n - 1; i >= 1; i --)//从最后一排到第一排
{
for(int j = 1; j <= i; j ++)
{
dp[j] = max(dp[j], dp[j + 1]) + map[i][j];
}
}
cout << dp[1] << endl;
return 0;
}
/*
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
ans:30
*/

poj1163 the triangle 题解的更多相关文章

  1. ZOJ 4081 Little Sub and Pascal's Triangle 题解

    ZOJ 4081 Little Sub and Pascal's Triangle 题解 题意 求杨辉三角第n行(从1开始计数)有几个奇数. 考察的其实是杨辉--帕斯卡三角的性质,或者说Gould's ...

  2. POJ1163 The Triangle 【DP】

    The Triangle Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 36918   Accepted: 22117 De ...

  3. POJ1163——The Triangle

    Description 73 88 1 02 7 4 44 5 2 6 5 (Figure 1) Figure 1 shows a number triangle. Write a program t ...

  4. codechef Sums in a Triangle题解

    Let's consider a triangle of numbers in which a number appears in the first line, two numbers appear ...

  5. (数字三角形)POJ1163 The Triangle

    The Triangle Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 59698   Accepted: 35792 De ...

  6. POJ1163 The Triangle

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 44997   Accepted: 27174 Description 73 ...

  7. Poj1163 The Triangle(动态规划求最大权值的路径)

    一.Description 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure 1 shows a number triangle. Write a pro ...

  8. CF336A Vasily the Bear and Triangle 题解

    Content 一个矩形的顶点为 \((0,0)\),其对顶点为 \((x,y)\),现过 \((x,y)\) 作直线,分别交 \(x\) 轴和 \(y\) 轴于 \(A,B\) 两点,使得 \(\t ...

  9. poj-3176 Cow Bowling &&poj-1163 The Triangle && hihocoder #1037 : 数字三角形 (基础dp)

    经典的数塔模型. 动态转移方程:  dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+p[i][j]; #include <iostream> #include ...

  10. POJ1163 The Triangle: 倒三角形问题

    经典的DP问题,DP思想也很直接: 直接贴代码: #include<iostream> #include<cstdio> #include<algorithm> # ...

随机推荐

  1. Quartus prime 的安装步骤:

  2. 【python爬虫案例】用python爬取百度的搜索结果!2023.3发布

    目录 一.爬取目标 二.展示结果数据 三.编写爬虫代码 3.1 请求头和cookie 3.2 分析请求地址 3.3 分析页面元素 3.4 获取真实地址 3.5 保存结果数据 四.同步讲解视频 五.附完 ...

  3. 安装pyenv-win(windows 环境)支持多个python环境管理

    安装pyenv-win(windows 环境)支持多个python环境管理 https://blog.csdn.net/dair6/article/details/129128240

  4. linux服务器配置查看

    查看linux服务器配置 查硬盘信息 sblk 看sda sdb sdc之类的 以下可以看出是500G sda第一块,sdb是第二块 以下可以看出是 1T+100G 查内存 free -h 查cpu ...

  5. 仅1.0MB,开源压缩软件7-Zip

    首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485212&idx=1 ...

  6. C#实现多线程的几种方式

    前言 多线程是C#中一个重要的概念,多线程指的是在同一进程中同时运行多个线程的机制.多线程适用于需要提高系统并发性.吞吐量和响应速度的场景,可以充分利用多核处理器和系统资源,提高应用程序的性能和效率. ...

  7. .NET6 Minimal API 集成Autofac

    前提 集成Autofac前需要先添加两个依赖包 可以通过 NuGet 进行安装,使用以下命令: dotnet add package Autofac dotnet add package Autofa ...

  8. 用pageOffice控件实现 office word文档 强制留痕编辑Word

    OA办公中,业务需要多人编辑word文档,需要强制留痕功能,用来查看文档编辑过程中的具体修改痕迹. 怎么实现word文档的强制留痕呢? 1 实现方法 通过pageOffice实现简单的在线打开编辑wo ...

  9. PageOffice 在线打开 word 文件并添加水印

    一.服务器端方法插入水印 1.插入文字水印 WordDocument doc = new WordDocument(); //添加水印 ,设置水印的内容 doc.getWaterMark().setT ...

  10. pod(六):初始化容器Init Containers

    目录 一.系统环境 二.前言 三.初始化容器Init Containers 3.1 何为初始化容器Init Containers 3.2 Init Containers与普通容器的不同之处 3.3 I ...