`
yeshaoting
  • 浏览: 683449 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

动态规划 - 求解二项式系数(完整代码)

J# 
阅读更多

 

1. 动态规划 备忘录法

备忘录方法采用自顶向下方式,为每个解过的子问题建立了备忘录以备需要时查看,避免了相同子问题的重复求解。

 

/*
@author: jarg
@TODO 动态规划 - 备忘录法 求解二项式系数
*/

import java.io.*;
import java.util.*;

public class Binomial
{
	/*
	Map<K,V>中K,V说明
	K: n,m组成的字符串
	V: value求解出的值
	demo: 备忘录,保存已经求解出的子问题的解
	*/
	public static Vector<Map> demo = new Vector<Map>();

	public static void main(String[] args)
	{
		InputStreamReader ir = new InputStreamReader(System.in);
		try
		{
			System.out.print("输入参数n: ");
			int n = Integer.parseInt("" + (char)ir.read());

			/* 过滤输入参数n时,末尾的回车,换行 */
			if((char)ir.read() == '\r' || (char)ir.read() == '\n')
			{
				ir.read();
			}

			System.out.print("输入参数m: ");
			int m = Integer.parseInt("" + (char)ir.read());

			System.out.println("Binomial("+ n + "," + m +")=" + Binomial(n,m));
		}
		catch(Exception e)
		{
			System.out.println("invalid input.");
		}

	}

	/* 求二项式系数 */
	public static int Binomial(int n,int m)
	{
		/* 边界条件 */
		if(n==m || m==0)
		{
			return 1;
		}

		int date = readDate(n,m);
		if(date>0)
		{
			/*
			子问题已经计算过
			读取保存在备忘录中的数据
			*/
			return date;
		}
		else
		{
			/*
			子问题未计算过
			解出子问题,将数据保存在备忘录中
			*/
			int result = Binomial(n-1,m) + Binomial(n-1,m-1);
			writeDate(n,m,result);
			return result;
		}
	}

	/* 从备忘录中读取数据 */
	public static int readDate(int n,int m)
	{
		for(int i=0;i<demo.size();i++)
		{
			Map<String,Integer> date = new HashMap<String,Integer>();
			date = demo.get(i);
			if(date.get("" + n + m) != null)
			{
				return date.get("" + n + m);
			}
		}
		return 0;
	}

	/* 向备忘录中写入数据 */
	public static void writeDate(int n,int m,int value)
	{
		Map<String,Integer> date = new HashMap<String,Integer>();
		date.put("" + n + m,value);
		demo.add(date);
	}

}

 

2. 动态规划 迭代法:

迭代法采用自底向上方式,保存已求解的子问题,需要时取出,消除对某些子问题的重复求解.

/*
@author: jarg
@TODO: 动态规划 - 求解二项式系数
*/

import java.io.InputStreamReader;

public class Binomial
{
    public static void main(String[] args)
    {
		InputStreamReader ir = new InputStreamReader(System.in);
		try
		{
			System.out.print("输入参数n: ");
			int n = Integer.parseInt("" + (char)ir.read());

			/* 过滤输入参数n时,末尾的回车,换行 */
			if((char)ir.read() == '\r' || (char)ir.read() == '\n')
			{
				ir.read();
			}

			System.out.print("输入参数m: ");
			int m = Integer.parseInt("" + (char)ir.read());

			System.out.println("Binomial("+ n + "," + m +")=" + binomial(n,m));
		}
		catch(Exception e)
		{
			System.out.println("invalid input.");
		}
        
    }

	/* 求二项式系数 */
    public static int binomial(int n, int m)
    {
        int value[] = new int[n+1];
		for(int i=0;i<=n;i++)
		{
			value[i] = 1;

			/* 边界条件m=0,n=m的情况 */
			for(int j=i-1;j>0;j--)
			{
				value[j] = value[j] + value[j-1];
			}
		}
		return value[m];
    }

}

 

分享到:
评论

相关推荐

    动态规划 - 求解二项式系数(自顶向下,自底向上)

    "Binomial - 动态规划 - 备忘录法"可能是关于使用备忘录法实现动态规划的详细步骤或代码示例,而"Binomial - 动态规划"可能包含更广泛的动态规划在求解二项式系数问题上的应用或扩展讨论。 动态规划在实际编程中...

    二项式计算器c#源代码

    在本案例中,这个二项式计算器源代码实现了对无限长二项式表达式的计算,这意味着用户可以输入任意复杂度的二项式公式,程序将能准确地给出结果。 二项式公式是数学中的一个重要概念,通常表示为(a + b)^n,其中a和...

    实现一个求解一元二次方程的类,该类包含三个成员变量和一个求解一元二次方程解的函数,该函数需要抛出异常(1.无解的异常 2二次项系数为0的异常))

    此外,这个方法必须能够处理两种异常情况:一是方程无解,二是二次项系数 `a` 为0。 首先,我们来创建这个类,我们可以命名为 `QuadraticEquationSolver`。这个类需要三个私有成员变量,即 `a`, `b`, 和 `c`,它们...

    【路径规划-二维路径规划】基于蚁群算法求解电动汽车充电站与换电站协调规划附matlab代码 上传.zip

    【路径规划-二维路径规划】基于蚁群算法求解电动汽车充电站与换电站协调规划是一项重要的交通优化问题,尤其在当前电动汽车普及的背景下,如何合理布局充电设施,以确保车辆在行驶过程中能有效补给能源,是提升城市...

    线性方程求解代码

    克拉默认则涉及到计算子矩阵的行列式,然后用这些行列式除以系数矩阵的行列式。在C++中,可以使用库函数(如`std::det()`)来计算行列式,但这种方法只适用于小规模问题,因为行列式计算复杂度较高。 3. **矩阵逆法...

    matlab开发-Generatebinomialtable

    在MATLAB编程环境中,"Generatebinomialtable" 是一个用于创建二项式系数表的简单函数。二项式系数在组合数学中具有重要地位,它出现在二...在实际项目中,能够快速获取和操作二项式系数可以使问题的求解变得更加高效。

    计算(ax+by)n的xnym的实验系数

    这个过程通常通过组合数(也称为二项式系数)和指数幂的乘积来实现,即利用二项式定理。 数据范围部分提供了算法设计和测试的边界条件,比如对于不同百分比的数据有不同的限制。这些条件对于优化算法和确保其在各种...

    用高斯消元法求解线性方程组的源代码

    高斯消元法是一种经典且基础的数值线性代数方法,用于求解线性方程组。在MATLAB环境中,我们可以编写函数来实现这一算法,以便于编程求解线性方程组。以下是关于高斯消元法及其在MATLAB中的应用的详细解释。 1. **...

    二项式

    3. **组合优化**:在寻找最优解的问题中,二项式系数可以帮助我们确定可能的组合数量,如在组合排序、组合搜索等场景。 4. **编码和解码**:在信息传输和加密算法中,二项式定理可以用于构建高效的编码系统,如...

    求解线性方程的c语言源代码

    系数和常数项存储在二维数组`A`中,其中`A[i][j]`表示第`i`行第`j`列的元素,`A[i][n+1]`表示第`i`行的常数项(即`b`向量的元素)。程序首先对系数矩阵进行初等行变换,将最大元素移动到对角线上,然后依次解出每一...

    求解线性方程的fortran代码

    例如,C1可能是初始化的系数矩阵,C2可能包含常数项,而C3到C15可能是中间计算结果或不同迭代步的存储。 在Fortran中,矩阵和向量可以用二维数组来表示。例如,可以声明一个二维数组`real, dimension(n,n) :: A`来...

    duoxiangshi.zip_site:www.pudn.com

    在编程中,实现二项式操作通常涉及到计算二项式系数,这可以通过直接计算或者使用动态规划来实现。例如,计算C(n, k)可以使用递归公式C(n, k) = C(n-1, k-1) + C(n-1, k),但为了避免重复计算,可以使用一个二维数组...

    C 代码 查找二维参数的数据 z(x,y) 的多项式插值 通过设置和 求解多项式系数的线性系统 涉及范德蒙德矩阵.rar

    这使得矩阵的行列式非常容易计算,或者可以使用高斯消元法、LU分解或QR分解等方法高效求解线性系统。 在C语言实现中,"vandermonde_interp_2d"文件可能包含了创建范德蒙德矩阵、构建线性系统以及求解系数的函数。...

    用VC++画数学函数图(sin,cos ,二项式等等)

    例如,二项式系数可以用组合数公式求解,指数函数则通过指数运算实现。这些函数的图像绘制原理与三角函数类似,只是计算y值的过程不同。 除了绘图,我们还需要为用户提供输入功能,让他们能指定函数参数或直接输入...

    C++程序求解线性方程组

    3. **矩阵逆法**:如果系数矩阵是可逆的(即行列式不为零),那么可以通过计算矩阵的逆并乘以常数向量来求解。C++中,我们可以利用库函数如`std::matrix`(如果使用了Boost库)或`Eigen`库来处理矩阵运算。 4. **...

    基于Java实现多个题目求解(算法课程)【100012653】

    这个题目涉及到数学中的二项式定理,要求实现一个程序来计算给定指数的二项式系数。在Java中,可以使用递归或动态规划方法来计算,理解组合数的概念至关重要。 2. **简单分形树**: 分形几何是计算机图形学的一个...

    简单的一次二次三次方程求解-Java

    在Java编程语言中,求解一次、二次及三次方程是一项常见的数学运算任务。这个程序设计的目的是通过代码实现这些方程的解析,为用户提供一个便捷的计算工具。以下是关于这个主题的一些详细知识点: 1. **一次方程**...

    MATLAB拟合求解圆心和半径 源程序代码.zip

    在MATLAB中,拟合和求解圆心与半径是一项常见的数据分析任务,尤其是在处理具有圆形特征的数据时。本主题将深入探讨如何使用MATLAB进行此类操作,以及提供的源程序代码可能涉及的关键技术。 首先,我们需要理解拟合...

    线性方程组求解算法

    例如,可以使用动态内存分配创建二维数组来存储矩阵,使用递归或迭代结构实现算法,同时检查矩阵是否为奇异(行列式为零或主元选取不当导致数值不稳定)。在代码实现中,应确保良好的可读性和可维护性,可能还需要...

    python-曲线拟合-原理-代码.docx

    通常选择的拟合曲线是二项式方程的形式,如 y = a0 + a1*x + a2*x^2 + ... + an*x^n,其中ai是待确定的系数。最小二乘法的目标是使所有偏差的平方和最小,即 Σ(yi - φ(xi))^2 最小。 在Python中,我们可以利用...

Global site tag (gtag.js) - Google Analytics