leetcode_120题——Triangle (动态规划)

Triangle

Total Accepted: 39052 Total Submissions: 143341My Submissions

Question Solution

Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.

For example, given the following triangle

[
     [2],
    [3,4],
   [6,5,7],
  [4,1,8,3]
]

The minimum path sum from top to bottom is 11 (i.e., 2 + 3 + 5 + 1 = 11).

Note:
Bonus point if you are able to do this using only O(n) extra space, where n is the total number of rows in the triangle.

Hide Tags

Array Dynamic Programming

Have you met this question in a real interview?

Yes

No

Discuss

这道题属于比较简单的动态规划那一类题,若是采用递归的思想来做就时间复杂度就太复杂了,

从下往上依次递推,欲计算上一行的最小路径,先求出它下面的最小路径

#include<iostream>
#include<vector>
#include <algorithm>
using namespace std;

int minimumTotal(vector<vector<int> > &triangle) {
	int len_line=triangle.size();
	vector<int> temp;
	if(triangle.empty())
		return 0;
	if(len_line==1)
		return triangle[0][0];

	for(int j=0;j<len_line;j++)
		temp.push_back(triangle[len_line-1][j]);
	for(int i=len_line-2;i>=0;i--)
	{
		for(int j=0;j<=i;j++)
			temp[j]=min(temp[j],temp[j+1])+triangle[i][j];
	}
	return temp[0];
}
int main()
{
	vector<vector<int> > vec;
	vector<int> vec_line;

	vec_line.push_back(-1);
	vec.push_back(vec_line);

	vec_line.clear();
	vec_line.push_back(2);
	vec_line.push_back(3);
	vec.push_back(vec_line);

	vec_line.clear();
	vec_line.push_back(1);
	vec_line.push_back(-1);
	vec_line.push_back(-3);
	vec.push_back(vec_line);

	cout<<minimumTotal(vec)<<endl;

}

  

时间: 2024-10-17 04:08:14

leetcode_120题——Triangle (动态规划)的相关文章

poj3616题(动态规划),看了别人的提示,自己又写了一遍

http://blog.csdn.net/xiaozhuaixifu/article/details/10818657参考文档链接 动态规划的主要三种思维方式:递推(从前往后想),状态转移(从后往前想),记忆化搜索(记录之后直接查寻).这里使用状态转移的思维解题,明确除了没有移动这种情况,每次接受到或接受不到的位置可以由移位或不移位两种情况转移而来,到了该位置后根据原始数据直接加或不加总和. #include <stdio.h> #include <stdlib.h> #inclu

poj 1163 The Triangle (动态规划)

The Triangle Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 37778   Accepted: 22685 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

LeetcodeOJ: Triangle 动态规划

Total Accepted: 31557 Total Submissions: 116793 Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below. [ [2], [3,4], [6,5,7], [4,1,8,3] ] The minimum path sum from top to bottom is

笔试编程题必杀技——动态规划

在笔试编程题中,最常见题型莫过于动态规划了,以前一直不太清楚,今天下定决心好好梳理一番. 动态规划是通过组合子问题的解决而解决整个问题的,一个大问题分解成一个小问题,这个小问题再分成小问题,以此类推,直至求出最终结果. 首先看一个把我虐了无数遍的问题:最大子数组的问题. 题目:一个有N个整数元素的一位数组(A[0], A[1],...,A[n-1], A[n]),这个数组当然有很多子数组,那么数组之和的最大值是什么呢? 例如:有数组int A[5] = {-1, 2, 3, -4, 2}:符合条

算法题之动态规划

题目来源:牛客网 众所周知计算机代码底层计算都是0和1的计算,牛牛知道这点之后就想使用0和1创造一个新世界!牛牛现在手里有n个0和m个1,给出牛牛可以创造的x种物品,每种物品都由一个01串表示.牛牛想知道当前手中的0和1可以最多创造出多少种物品. 输入描述: 输入数据包括x+1行:第一行包括三个整数x(2 ≤ x ≤ 20),n(0 ≤ n ≤ 500),m(0 ≤ m ≤ 500),以空格分隔接下来的x行,每行一个01串item[i],表示第i个物品.每个物品的长度length(1 ≤ len

nyoj 18 The Triangle 动态规划

和nyoj613(免费馅饼)一样的原理  从下 网上依次遍历 存贮最大值 #include <stdio.h> #include <algorithm> using namespace std; int main() { int n,num[105][105]={0}; scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) scanf("%d",&n

免费馅饼(坑题,动态规划)

wa十多次找不出来错误,贴下吊人代码算了... 免费馅饼 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不 掉,就掉落在他身旁的10米范围内.馅饼如果掉在了地上当然就不能吃了,所以gameboy马上卸下身上的背包去接.但由于小径两侧都不能站人,所以他只 能在小径上接.由于gameboy平时老呆在房间里玩游戏,虽然在游戏中是个身

Leetcode动态规划【简单题】

目录 Leetcode动态规划[简单题] 53. 最大子序和 题目描述 思路分析 复杂度分析 70.爬楼梯 题目描述 思路分析 复杂度分析 121.买卖股票的最佳时机 题目描述 思路分析 复杂度分析 303.区域和检索-数组不可变 题目描述 思路分析 复杂度分析 Leetcode动态规划[简单题] 动态规划(Dynamic programming,简称DP),是一种把原问题分解为相对简单的子问题的方式求解复杂问题的方法.动态规划相较于递归,拥有更少的计算量. 53. 最大子序和 题目描述 给定一

动态规划题目

动态规划算法,在T大某位老师的书中说就是递推+重复子问题. 动态规划算法的效率主要与重复子问题的处理有关. 典型的题目有 陪审团,最大公共子串问题 1,最大公共子串问题 这个是动态规划的基础题目.动态规划就是递推和重复子结构. 确定了递推关系后.找到一个能极大地减少重复运算的子结构至关重要.选的好了,时间效率会很好. 这个问题,不妨设第一个串为a,长度为n,第二个串为b,长度m.那么最长的子序列长度为f(n,m) 当a[n]=a[m]时 f(n,m)=1+f(n-1,m-1) 否则f(n,m)=