[动态规划]保存子问题的结果

问题描述:

给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法

这里如果直接每次的计算乘积的话,时间复杂度为O(n2),所以可以使用动态规划的思想,保存中间结果,这样的时间复杂度就能够降低到O(n)。

vector<int> multiply(const vector<int>& A)
{

	vector<int> res;
	int left[100];
	int right[100];
	int size = A.size();

	left[0] = 1;
	for(int i = 1; i < size; i++)
	{
		left[i] = left[i - 1] * A[i- 1];
	}

	right[size - 1] = 1;
	for(int j = size - 1 - 1; j >= 0; --j)
	{
		right[j] = right[j + 1] * A[j + 1];
	}

	for(int k = 0; k < size; k++)
	{
		res.push_back(left[k] * right[k]);
	}

	return res;
}

  

时间: 2024-10-25 20:02:45

[动态规划]保存子问题的结果的相关文章

动态规划-重叠子问题

动态规划-重叠子问题 flyfish 2015-8-23 名词解释 重叠子问题 overlapping subproblems 动态规划策略将问题分解为一个或者多个子问题 重叠子问题是一个递归解决方式里包括的子问题尽管非常多,但不同子问题非常少.少量的子问题被重复解决非常多次. 比如LCS(最长公共子序列)问题,给定两个序列X和Y,长度各自是m和n,穷举子问题是指数级的,而不同子问题的数量仅仅是mn. a recurisive algorithn for the problem solves t

动态规划-爬楼梯问题

其实我一直分不清楚动态规划和分治,递归之间的区别与联系...<( ̄3 ̄)> 三者之间应该是有点关系的吧 网上说: 1. 什么是动态规划?         和分治法一样,动态规划(dynamicprogramming)是通过组合子问题而解决整个问题的解.         分治法是将问题划分成一些独立的子问题,递归地求解各子问题,然后合并子问题的解.         动态规划适用于子问题不是独立的情况,也就是各子问题包含公共的子子问题.         此时,分治法会做许多不必要的工作,即重复地求

求换取零钱的最少金币个数个数--动态规划问题2

输入m个数字(正数,必须含有1.)代表金币的面值,再输入n代表换钱的总额,求换取的最少金币个数. 动态规划问题2 动态规划的基本思想是将待求解问题分解成若干个子问题,先求解子问题,并将这些子问题的解保存起来,如果以后在求解较大子问题的时候需要用到这些子问题的解,就可以直接取出这些已经计算过的解而免去重复运算.保存子问题的解可以使用填表方式,例如保存在数组中. 代码如下: import java.util.Scanner; public class Jin_bin_zhao_ling { publ

动态规划总结

动态规划通常应用于最优化问题,即要做出一组选择以达到一个最优解.在做选择的同时,经常出现同样形式的子问题.当某一特定的子问题可能出自于多于一种选择的集合时,动态规划是很有效的.关键技术是存储这些子问题每一个的解,以备它重复出现. 和分治法一样,动态规划是通过组合子问题的解而解决整个问题的.动态规划适用于子问题不是独立的情况,也就是各子问题包含公共的子子问题.动态规划算法对每个子子问题只求解一次,将其结果保存在一张表中,从而避免每次遇到各个子问题时重新计算答案. 动态规划通常应用于最优化问题.此类

《算法导论》中动态规划求解钢条切割问题

动态规划算法概述 动态规划(dynamic programming)1是一种与分治方法很像的方法,都是通过组合子问题的解来求解原问题.不同之处在于,动态规划用于子问题重叠的情况,比如我们学过的斐波那契数列.在斐波那契数列的求解问题中,我们经常要对一个公共子问题进行多次求解,而动态规划算法,则对每个子问题只求解一次,将其解保存在一个表格中,从而避免了大量的冗余计算量. 动态规划算法常用于寻找最优解问题(optimization problem).而其规划大概可分为四步: 1.刻画一个最优解的结构特

算法导论--动态规划(钢条切割)

钢条切割问题 现有一段长度为n英寸的钢条和一个价格表pi,求切割方案使销售利益最大rn最大 长度为n英寸的钢条共有2n?1种不同的切割方案,因为可以每个整英寸的位置都可以决定切割或者不切割. 为了得到rn最大,可以把这个问题分成子问题求解,先切一刀,再考虑余下的部分的最大收益即求 rn=max{pk+rn?k}(k=1,2,3-n-1), pk部分不进行继续切割,直接作为一个整体售出 ; rn?k部分继续切割,考虑所有的情况,分成子问题. 求出所有k值对应的收益最大者作为rn 也有可能不进行任何

70. Climbing Stairs【leetcode】递归,动态规划,java,算法

You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top? Note: Given n will be a positive integer. 题目分析:每次只能走1或2步,问n步的话有多少中走法???? 可以用动态规划和递归解

算法导论-动态规划-装配线调度

动态规划(dynamic programming)是通过组合子问题的解而解决整个问题的.分治算法是指将问题划分为一些独立的子问题,递归地求解各子问题,然后合并子问题的解而得到原问题的解.动态规划适用于子问题不是独立的情况,也就是各子问题包含公共的子子问题.在这种情况下,若用分治法则会做许多不必要的工作,即重复地求解公共的子子问题.动态规划对每个子子问题只求解一次,将结果保存在一张表中,从而避免每次遇到各个子问题时重新计算答案. 动态规划通常应用于最优化问题.此类问题可能有很多种可行解,每个解有一

转载:动态规划

来源:http://blog.sina.com.cn/s/blog_7727572f01011461.html 动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法.20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问