【动态规划初级】动态规划入门 poj1163 The Triangle

动态规划

我在学习算法的时候,就被动态规划搞得是一头雾水,这几日终于是弄明白是怎么回来。

明白之后我才发觉我以前就碰到过一道ACM题,大意是这样的:

有这样形式的一种排列:

例如:

7

      3  
8

    8   1   0

 
2   7   4   4

4   5  
2   6  
5

从顶至下找一条路径,使得这条路径上的数字之和最大,而且每一步只能向左下或右下找,直到到最后一行。

比如:第二行的3只能找第三行8或者1。

上面例子的最大一条路径是:7-3-8-7-5;总和30(原题:http://acm.fzu.edu.cn/problem.php?pid=1004)

如果按照贪婪算法,从上往下找,则最佳路径应该是7-8-1-7-5;总和28

可见贪婪算法在此是行不通的。我们可以试着从下往上找,倒数两行:

2   7   4  
4

4   5   2   6  
5
我们先对最后一行相邻的两个数字进行比较,大的加到上一行的数字上。则4-5比较5较大则倒数第二行2+5;

5-2比较5较大,则倒数第二行7+5,如此类推:则倒数第二行就是:

7   12  10  10;

然后依此类推:直到第一行,就得到了最大的和,当然原题没有要求我们找路径,所以不用记录路径.

其实这就是一种动态规划的应用。

它与贪婪法的区别,在此也能明显地看出:

1:贪婪法,采取的是自顶向下,逐步找局部最优,从而来达到,整体最优.

而动态规划则是从下往上倒推,

2:贪婪法,在进行决策时并不依赖于上一步的决策。每一步的决策都是单独的,确定的,不可回遡的。

比如在找第一行7的下一个节点,那肯定是第二行的8,它是确定的,不可回遡的。而第二行的8的下一个结点肯定是1,它并不依赖于上一步的决策,

而动态规划则是不同的,它的每一步进行决策时是依赖于上一步的决策的。每一步的决策的相关的,是可回遡的。

比如在找第一行7的下一个节点,它能有两个种决策,一个是第二行的3,一个是第二行的8。由于有这两种可能性,所以在进行,第二行至第三行的决策的时候,是依赖于上一步决策的。而且由于每一次决策所以产生的可能的状态,都被保荐着,所以当所以找的决策不是最优决策时,可以回遡。

越说越麻烦了,一句话,就是动态规划其实是以牺牲空间来换取决策的正确性.

来源: <http://6460646.blog.163.com/blog/static/27779875200732894639165/>




The
Triangle










Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 36089 Accepted: 21581

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

来源: <http://poj.org/problem?id=1163>
 

这个最简单的动态规划题目满足了动态规划的四个条件:
1.
Characterize the structure of an optimal solution.  有公共的子问题
2.
Recursively define the value of an optimal solution.  能递归的定义子问题的最优解
3. Compute the value of an optimal solution
in a bottom-up fashion. 能自底向上的求解
4.
Construct an optimal solution from computed
information.   能通过计算信息构造出最优解

来源: <http://sun.solrex.org/?p=166>

import java.util.Scanner;
public class Main{
    public static void main(String []args){
        Scanner scanner=new Scanner(System.in);
        int n;
        n=scanner.nextInt();
        int mar[][]=new int[n+1][n+1];
        for(int i=0;i<n;i++){
            for(int j=0;j<=i;j++){
                mar[i][j]=scanner.nextInt();
            }
        }
        int max=0;
        for(int i=n-2;i>=0;i--){
            for(int j=0;j<=i;j++){
                max=mar[i+1][j]>mar[i+1][j+1]?mar[i+1][j]:mar[i+1][j+1];
                
                mar[i][j]+=max;
            }
        }
        System.out.println(mar[0][0]);
    }
    
}

来自为知笔记(Wiz)

时间: 2024-08-28 09:03:10

【动态规划初级】动态规划入门 poj1163 The Triangle的相关文章

【转】什么是动态规划?动态规划的意义是什么

https://www.zhihu.com/question/23995189 徐凯强 Andy 永远好奇 赵劼 . 空明流转 等 1818 人赞同了该回答 动态规划中递推式的求解方法不是动态规划的本质. 我曾经作为省队成员参加过NOI,保送之后也给学校参加NOIP的同学多次讲过动态规划,我试着讲一下我理解的动态规划,争取深入浅出.希望你看了我的答案,能够喜欢上动态规划. 0. 动态规划的本质,是对问题状态的定义和状态转移方程的定义.引自维基百科 dynamic programming is a

通过金矿模型介绍动态规划(经典入门)

对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思考动态规划.本文力求通俗易懂,无异性,不让读者感到迷惑,引导读者去思考,所以如果你在阅读中发现有不通顺的地方,让你产生错误理解的地方,让你难得读懂的地方,请跟贴指出,谢谢! ----第一节----初识动态规划-------- 经典的01背包问题是这样的: 有一个包和n个物品,包的容量为m,每个物品都有各自的体积和

矩阵求连续递减序列个数,动态规划初级,递归,poj1088

题目描述: Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道载一个区域中最长底滑坡.区域由一个二维数组给出.数组的每个数字代表点的高度.下面是一个例子 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小.

最大子矩阵,最大连续子数组进阶,动态规划初级,poj1050

题目描述:现给出一个N*N矩阵,要求求出拥有最大和的子矩阵的和. 例如: 这样的一个矩阵,最大子矩阵的和为15: 此题可以让人联想到求最大连续子数组,求最大子数组在上一篇文章中http://www.cnblogs.com/tz346125264/p/7560708.html. 分析:最大子矩阵可以看为求最大连续子数组拓展到二维数组上,因为矩阵的性质同样在横向竖向上需要连续,那么可以想办法将这个二维数组简化为求连续子数组. 思考: 1.要求最大子矩阵,必须保证每个矩阵都被浏览到,为了保证运行时间尽

【动态规划初级】 BadNeighbors

目录 最大连续序列和 不连续序列的最大和 1.最大连续序列和是指所有连续子序列元素和最大的那个. #include<iostream>#include<stdio.h>using namespace std;int main(){    freopen("in.txt","r",stdin);    int n;    while(cin>>n)    {        int a[n];        int sum=0;   

【动态规划初级】longest increasing subsequence

一个序列有N个数:A[1],A[2],A[3]--A[N],求最长非降子序列的长度. 最重要的是要找出所谓的"状态",本题目中是d[i],初始化最长长度为自己本身即一个单位长度. 看是否要加入第i个元素,如果第i个元素a[i]比当前序列的最后一个元素a[j]大的话,那么加入,同时d[i]=d[j]+1;体会d[j]+1>d[i] ,比如,对于序列[5,3,4,8,6,7]当i=3,即a[i]=8的时候,j=0,8比5大,d[3]=d[0]+1=2;j=1,8比3大,但是d[1]+

动态规划 初级背包问题。。

状态转移方程 B[n][w]=B[n-1][w-W[i]]+V[i] 表示取走第n个物品,重量为W时的价值量. W V分别存放重量和价值的数组. #include<iostream> #include<vector> #include<math.h> // 背包问题 using namespace std; int value[]={3,4,5,8,10}; int weight[]={2,3,4,5,9}; const int N=5; const int W=20;

POJ1163 The Triangle 【DP】

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

动态规划②——线性动态规划(背包)

二.线性动态规划 上次只能算一个热身,这次是真正的动态规划了.还是洛谷(http://www.luogu.org/problem/show?pid=1048):题目描述 Description辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值.我会给你一段时间,在这段时间里,你可以采到一些