动态规划的概念对于新手来说枯燥难懂,就算看懂了,做题的时候依旧抓耳挠腮的毫无头绪,这些比较难理解的算法,还是需要根据例子来一步步学习和理解,从而熟练掌握,下面,咱们就通过一个简单的小例子来学习动态规划:

数字三角形(POJ1163)

在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。

路径上的每一步都只能往左下或 右下走。只需要求出这个最大和即可,不必给出具体路径。 三角形的行数大于1小于等于100,数字为 0 - 99

输入格式:

5      //表示三角形的行数    接下来输入三角形

7

3   8

8   1   0

2   7   4   4

4   5   2   6   5

要求输出最大和

咱们来分析这道题:

1.需要有一个变量 n 来存储输入的行数

2.需要一个二维数组 a 来存储输入的数字三角形

3.需要另一个同样大小的二维数组 b,用来存储到每一层的每一个数的最短路径,

例如:

到三角形的第三层,有两条路会经过1,

由于7+3=10<7+8=15,所以b数组的1的位置存储的是最短路径7—>3—>1等于11,

而在最两边的,就直接累加就ok了,7+3+8=18,7+8+0=15

这也是这个程序的核心部分,代码如下:

因为第一层跟a数组的第一层相同,所以i从1开始循环

然后遍历最后一层,求出最小值就ok啦

b数组最后的值

完整代码如下:

import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sca = new Scanner(System.in);
int n = sca.nextInt();
int[][] a = new int[n][n];
int[][] b = new int[n][n];
int min;
for(int i = 0;i<n;i++){
for(int j = 0;j<=i;j++){
a[i][j] = sca.nextInt();
}
} b[0][0] = a[0][0];
for(int i = 1;i<n;i++){
for(int j = 0;j<=i;j++){
if(j==0)//左侧,直接相加
b[i][j] = b[i-1][j]+a[i][j];
else if(j==i)//右侧,直接相加
b[i][j] = b[i-1][j-1]+a[i][j];
else//中间,需要用min函数求经过这条路的最短路径
b[i][j] = Math.min(b[i-1][j-1],b[i-1][j])+a[i][j];
}
} min = b[n-1][0];
for(int i = 1;i<b[n-1].length;i++){
if(b[n-1][i]<min)
min = b[n-1][i];
}
System.out.println(min);
}
}

  

总结一下动态规划的解题思路:

1,将原问题分解为简单的子问题,子问题求出来之后,原问题也就很容易得到了

2,确定状态转移方程

这道题的状态转移方程:

动态规划一般可分为线性动规,区域动规,树形动规,背包动规四类。
举例:
线性动规:拦截导弹,合唱队形,挖地雷,建学校,剑客决斗等;
区域动规:石子合并, 加分二叉树,统计单词个数,炮兵布阵等;
树形动规:贪吃的九头龙,二分查找树,聚会的欢乐,数字三角形等;
背包问题:01背包问题,完全背包问题,分组背包问题,二维背包,装箱问题,挤牛奶(同济ACM第1132题)等;
应用实例:
最短路径问题 ,项目管理,网络流优化等;
以上例子,每类挑选一题或两题练习即可
 
 
 
所有的算法都需要多加练习,应用起来才能得心应手,希望我的这篇博客能给各位爱学习的同伴们带去一些收获,我也是新手,大家共同努力,加油!

动态规划入门——数字三角形(Java)的更多相关文章

  1. 动态规划之数字三角形(POJ1163)

    在下面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大.路径上的每一步都只能往左下或 右下走.只需要求出这个最大和即可,不必给出具体路径. 既然求目标问题是根据查表得来的,自然 ...

  2. JDOJ 1606 数字三角形

    JDOJ 1606: 数字三角形 JDOJ传送门 Description 输入n,输出n的数字三角形 见样例 Input n Output n的数字三角形 Sample Input 4 Sample ...

  3. 简单DP入门(一) 数字三角形

    数字三角形

  4. 动态规划略有所得 数字三角形(POJ1163)

    在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大.路径上的每一步都只能往左下或 右下走.只需要求出这个最大和即可,不必给出具体路径. 三角形的行数大于1小于等于100,数 ...

  5. hihoCoder #1037 : 数字三角形 (动态规划)

    题目链接:https://hihocoder.com/problemset/problem/1037# 问题描述 小Hi和小Ho在经历了螃蟹先生的任务之后被奖励了一次出国旅游的机会,于是他们来到了大洋 ...

  6. Problem C: 动态规划基础题目之数字三角形

    Problem C: 动态规划基础题目之数字三角形 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 208  Solved: 139[Submit][Sta ...

  7. 数字三角形 (DP入门)

    7 3     8 8     1     0 2     7     4     4  4     5     2     6     5 给出一个数字三角形.从三角形的顶部到底部有很多条不同的路径 ...

  8. Java实现 蓝桥杯 算法训练 数字三角形

    算法训练 数字三角形 时间限制:1.0s 内存限制:256.0MB 问题描述 (图3.1-1)示出了一个数字三角形. 请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的总和最大. ●每 ...

  9. [动态规划]数字三角形(版本I-III)

    level 1 1.1题目 1.1.1题目描述 考虑在下面被显示的数字金字塔. 写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大.每一步可以走到左下方的点也可以到达右下方的点. 在 ...

随机推荐

  1. 简单实现RN调用原生方法(IOS)

    在React Native中,一个“原生模块”就是一个实现了“RCTBridgeModule”协议的Objective-C类(个人理解RCTBridgeModule就是react与native之间的桥 ...

  2. python3 items() 与 python2 中iteritems()的区别

    在Python2.x中, iteritems() 用于返回本身字典列表操作后的迭代 Python 3.x 里面, iteritems() 方法已经废除了,而 items() 得到的结果是和 2.x 里 ...

  3. siege 高并发测试工具

    安装siege 下载 http://download.joedog.org/siege/siege-4.0.4.tar.gz 解压 sudo tar -zvxf siege-4.0.4.tar.gz ...

  4. Python 函数也是一种对象

    函数也是一种对象 func = lambda x, y: x+y print func(3, 4) def func(x, y): return x+y print func(3, 4) 效果相同. ...

  5. leecode第四题(寻找两个有序数组的中位数)

    题解: class Solution { public: double findMedianSortedArrays(vector<int>& nums1, vector<i ...

  6. Asp.net core 学习笔记 ( identity server 4 JWT Part )

    更新 : id4 使用这个 DbContext 哦 dotnet ef migrations add identity-server-init --context PersistedGrantDbCo ...

  7. ubuntu 下Visual Studio Code 安装

    Build in Visual Studio Code Install VSCode The easiest way to install for Debian/Ubuntu based distri ...

  8. type convert

    背景# 在开发中,我们会碰到诸如String类型转换为Int等等问题,虽然处理起来简单,但是本着DRY(Don't Repeat Yourself )原则,还是有必要封装处理下: 具体代码:Maste ...

  9. Run-time code to create charts:

    tChart1.Series.Clear(); tChart1.Series.Add(new Steema.TeeChart.Styles.Bar());tChart1.Series[0].Clear ...

  10. WPF——动画

    本文目录 前言 1.线性插值动画 2.关键帧动画 3.路径动画 前言 使用动画,是增强用户体验的一种有效的手段.合理的动画,可以让应用程序的界面看起来更加自然.真实.流畅.舒适,更有效地向用户展现信息 ...