The Triangle
Time Limit: 1000MS
|
|
Memory Limit: 10000K
|
Total Submissions: 19122
|
|
Accepted: 11144
|
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
Source
IOI 1994
解题思路:
基本的DP,从底往上扫描数组,递推式如下:
a(i,j)=a(i,j)+max(a(i+1,j),a(i+1,j+1))
其实刚开始用的是dfs递归,但结果操时。
先贴上dfs的代码吧(TLE):
#include <iostream>
const int MAX = 150;
int N;
int in[MAX][MAX];
//深搜
int dfs(int i, int j)
{
if(i == N-1) //到底了
{
return in[i][j];
}
int tm1 = dfs(i+1, j) + in[i][j]; //当前节点的左下边的节点
int tm2 = dfs(i+1, j+1) + in[i][j]; //当前节点的右下边节点
return tm1>tm2 ? tm1 : tm2; //取大的咯
}
int main()
{
int max = 0;
std::cin>>N;
for(int i=0; i<N; i++)
{
for(int j=0; j<i+1; j++)
{
std::cin>>in[i][j];
}
}
std::cout<<dfs(0, 0)<<std::endl; //从根节点开始
system("pause");
return 0;
}
下面是DP的代码(AC):
#include <iostream>
const int MAX = 101;
int N;
int in[MAX][MAX];
int main()
{
int max = 0;
std::cin>>N;
for(int i=0; i<N; i++)
{
for(int j=0; j<i+1; j++)
{
std::cin>>in[i][j];
}
}
//从数组倒数第二行开始扫描,从底向上计算
//in[i,j] = in[i,j] + max(in[i+1, j], in[i+1, j+1])
//最后最大值就存于in[0][0]中
for(int i=N-2; i>=0; i--)
{
for(int j=0; j<i+1; j++)
{
if(in[i+1][j] > in[i+1][j+1])
in[i][j] += in[i+1][j];
else
in[i][j] += in[i+1][j+1];
}
}
std::cout<<in[0][0]<<std::endl;
system("pause");
return 0;
}
分享到:
相关推荐
北大POJ1163-The Triangle
【标题】"POJ1163 - The Triangle" 是北京大学在线编程平台POJ上的一道算法题目。这道题目通常被归类为计算机科学与信息技术领域的算法问题,特别是涉及数据结构和动态规划的子领域。 【描述】该题目的解题报告详细...
"largest-triangle-three-buckets.js" 是一个 JavaScript 文件,实现了 Largest Triangle Three Buckets 算法。这个算法主要用于在二维平面上找到一组点中能够构成的最大三角形面积。在图像处理、数据可视化以及...
资源分类:Python库 所属语言:Python 资源全名:Flask-Triangle-joeflack4-0.5.6.zip 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
triangle-20200424-cp38-cp38-win_amd64
triangle-20200424-cp310-cp310-win_amd64
triangle-20200424-cp310-cp310-win32
triangle-20220202-cp310-cp310-win_amd64.whl
triangle-20220202-cp310-cp310-win32.whl
triangle-20220202-cp38-cp38-win32.whl
triangle-20220202-cp39-cp39-win32.whl
triangle-20220202-cp311-cp311-win32.whl
triangle-20200424-cp39-cp39-win32
triangle-20200424-cp38-cp38-win32
triangle-20200424-cp36-cp36m-win32.whl
triangle-20220202-cp37-cp37m-win32.whl
triangle-20200424-cp37-cp37m-win32
triangle-20200424-cp36-cp36m-win32
triangle-20220202-cp39-cp39-win_amd64.whl
triangle-20220202-cp38-cp38-win_amd64.whl