精华内容
下载资源
问答
  • 数字三角形

    2013-03-21 20:40:00
    有一个这样数字三角形:  7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 从顶点开始,每个数字向下层走只能有左下和右下两个方向,求出到达最后一行时最大路径之和. 今天从一本acm算法书看到...

    描述:

    有一个像这样的数字三角形:
             

                        7
          3 8
         8 1 0
        2 7 4 4
       4 5 2 6 5

    从顶点开始,每个数字向下层走只能有左下和右下两个方向,求出到达最后一行时的最大路径之和.

    今天从一本acm算法书看到的。题目不算难,但书里写的东西不错。解释在动态规划中,你所定义的状态很关键。同一个问题如果你定义的状态不同,你所得的状态转移方程自然不同。这有点废话。可严重的是,如果状态没定义好的话,甚至你根本用不了动态规划。因为你定义的状态根本不满足动态规划的基本要求:最优子问题,无后效性。所以这其实也是卡住很多人的地方。每次看这些题目的时候,总隐隐地觉得它满足最优子问题,甚至你也知道这个最优子问题的划分,可是你未必找得到状态转移方程。因为事实上你的状态并没有真正定义好。(划分阶段相对容易,这里就不论述了)

    例如:以上的题目,显然可以通过层划分。从顶点开始,逐层的向下走。

    状态一:如果定义的状态为,若为X层,其状态为D(X)为顶层到X层的最大路径之和。D(X)为最大,则D(X-1)为顶层到X-1层的最大。当事实并不成立。如上图D(3)=18, 7-3-8;而D(2)=15 7-8, D(3)的路径根本没有包含D(2)路径。

    状态二:若为X层,定义状态D(X,j)为顶层到第X的层第j的节点的最大路径之和。D(X,j)为D(X-1,j)和D(X-1,j-1)的最大加上节点j的值。对于一个数字(数字I),到达它的最优路线的最后一步可以是上或左上。不妨假设最后一步是上,那么到达下方数字(数字II)的路径也必须最优。可以 用“剪贴”方法证明这一点:如果到达数字II的路径非最优,那么可以改进路径使数字II的路径更优,这样到达数字I的路径还可以更优,与原先假设数字I路 线已经最优矛盾。所以到达数字II的路径必为最优。转移方程:D(X,j)=max{D(X-1,j],D(i-1,j-1]}+a[i,j]

    状态三:状态二是自顶向下的,那么也可以自底向上思考。定义状态D(X,j)为底层到第X的层第j的节点的最大路径之和。最终的结果为D(1,1)了。同理这个可以证明它是满足动态规划的基本条件的。

    其实动态规划的思想很灵活,很需要想象力。有时从某一个角度思考想不出来如何下手,不妨可以试试其他。当然也要建立在你深刻的理解动态规划的思想,否则连最简单的证明都没有,如何肯定你是在用动态规划来解题呢?而且题目本身能不能使用动态规划都是个问题,它又没有告诉你一定要使用动态规划解题。至此,写小小的思考而已。

    PS:没带简历,没法被网易藐视了。。。

    昨天以被搜狐藐视了。。。。

    继续好好复习,九月份后还是条好汉。。。

    一首<领悟>

    ...啊~多么痛得领wu...

     

    转载于:https://www.cnblogs.com/legendmaner/archive/2013/03/21/2974192.html

    展开全文
  • 第一次学习dfs同学也许我一样,刚开始学习时候,感觉在写dfs不知道要干些什么. 首先我们要知道dfs和bfs,一种是深度优先搜索,一种是广度优先搜索. 深度优先遍历只要前面有路,就会一直往前走,直到无路可走才会回头...

    基本思想

    第一次学习dfs的同学也许像我一样,刚开始学习的时候,感觉在写dfs不知道要干些什么.
    首先我们要知道dfs和bfs,一种是深度优先搜索,一种是广度优先搜索.
    深度优先遍历只要前面有路,就会一直往前走,直到无路可走才会回头.
    做这类形的题最主要的是不知道该如何写dfs方法.
    dfs首先想的是递归的终止条件,返回值以及边界条件,还有根据题目不同给出的不同判断条件.
    dfs方法本身是递归,递归的思想是我根据某种条件来逐渐深入搜索,条件是十分重要的.

    同时dfs的题中也会用到剪枝和回溯的思想.

    dfs模板

    	static int n,m;
    	static int[][] map;//map地图的意思用来模拟整个二维数组
    	static booelan[][] isg;// is go的意思,用来判断当前节点是否已经遍历了.
    	static int[][] lujin =  {{1,0},{-1,0},{0,1},{0,-1}};
    	//这里表示向上走,向下走,向左走,向右走
    	
    	static void dfs(int t,int x,int y) {// hdu1241 油田问题 八联通
    		
    		vis[x][y] = t;
    		isg[x][y]=true;
    		for(int i=0;i<4;i++) 
    			if(x<0&&y<0&&x>map.length&&y>map[0].length$$!isg[x][y]){		
    			dfs(t,x+lujin[i][0],y+lujin[i][1]);
    	}
    	}
    

    蓝桥javab组数字三角形

    试题 H: 数字三角形(20分)
    【问题描述】

    上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。 对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最 大的和。

    路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边的那个数。此外,向左下走的次数与向右下走的次数相差不能超过 1。

    【输入格式】

    输入的第一行包含一个整数 N (1 < N ≤ 100),表示三角形的行数。下面的 N 行给出数字三角形。数字三角形上的数都是 0 至 100 之间的整数。

    【输出格式】

    输出一个整数,表示答案。

    【样例输入】

    5
    7
    3 8
    8 1 0
    2 7 4 4
    4 5 2 6 5

    【样例输出】

    27

    思路

    首先看完这道题我们能得到以下几条信息

    • 遍历的时候只能向左下,右下走
    • 向左下走的次数与向右下走的次数相差不能超过 1,这个是整体的向左下走的次数与整体向右走的次数.
    • 返回的是最后走到底时的最大数值.

    现在开始设计dfs, 最重要的是要思考首先我们让其(0,0)点开始,首先我们考虑
    结束条件就是当遍历到底层,以及向左和向右的次数的差值为1

    if(x=n-1&&Math.abs(left-right)==1)

    第二考虑返回值, 这里我们要找到的是最大值,我们需要比较递归后返回的数值

    Math.max(maxx,max1);

    第三个我考虑的dfs方法的参数,这个参数的设置之前一直比较困扰我,我什么时候需要带参数,什么时候不需要带参数.
    我觉的应该是要把在递归中需要比较判断的参数放入dfs方法中.
    这里需要有的参数

    public static void dfs(int x,int y ,int left,int right,int max1){}

    接下来我们向下遍历的时候我们要考虑边界问题.

    if (xx>=1 && xx<=n && yy>=1 && yy<=xx && vis[xx][yy]==0) {

    这个题涉及到了回溯,回溯的思想是搜索一个问题的一个解或者 所有解 的方法。在求解的过程中,如果继续求解不能得到题目要求的结果,就需要 回退 到上一步尝试新的求解路径。

    这里的vis[][]用来判断当前节点是否已经走过了.

    接下来考虑剪枝,

     vis[xx][yy] = 1;
                    if (i==0)   left++;
                    else    right++;
                    dfs(xx,yy,left,right,sum+num[xx][yy]);
                    //就是在执行完dfs之后把状态恢复为之前的样子
                    vis[xx][yy] = 0;
                    if (i==0)   left--;
                    else    right--;
    

    代码

    import java.util.Scanner;
    
    public class Main {
    
        static int n;
        static int[][] dir = {{1,0},{1,1}};
        static int[][] num,vis;
        static int maxx;
        static void dfs(int x,int y,int left,int right,int sum) {
            if (x==n && Math.abs(left - right) <= 1) {
                maxx = Math.max(maxx, sum);
                return;
            }
            
            for (int i=0;i<2;i++) {
                int xx = x + dir[i][0];
                int yy = y + dir[i][1];
                if (xx>=1 && xx<=n && yy>=1 && yy<=xx && vis[xx][yy]==0) {
                    vis[xx][yy] = 1;
                    if (i==0)   left++;
                    else    right++;
                    dfs(xx,yy,left,right,sum+num[xx][yy]);
                    vis[xx][yy] = 0;
                    if (i==0)   left--;
                    else    right--;
                }
            }
        }
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Scanner sc = new Scanner(System.in);
            n = sc.nextInt();
            num = new int[n+1][n+1];
            vis = new int[n+1][n+1];
    
            for (int i=1;i<=n;i++) {
                for (int j=1;j<=i;j++) {
                    num[i][j] = sc.nextInt();
                    vis[i][j] = 0;
                }
            }
            vis[1][1] = 1;
            maxx = num[1][1];
            dfs(1,1,0,0,num[1][1]);
            System.out.println(maxx);
        }
    }
    
    
    展开全文
  • 数字三角形问题求解

    千次阅读 2012-03-02 14:42:55
    1. 问题描述 有一个这样的数字三角形:    7 ...从顶点开始,每个数字向下层走只能有左下和右下两个方向,求出到达最后一行时最大的路径之和. ...第1 行是数字三角形的行数n,1 接下来n行是

    1. 问题描述

    有一个像这样的数字三角形:
             

                            7
          3 8
         8 1 0
        2 7 4 4
       4 5 2 6 5

    从顶点开始,每个数字向下层走只能有左下和右下两个方向,求出到达最后一行时最大的路径之和.


    Input 
    第1 行是数字三角形的行数n,1<= n <=100。

    接下来n行是数字三角形各行中的数字。所有数字在0---99之间。

    比如Input是:

    5

    7

    3 8

    8 1 0

    2 7 4 4

    4 5 2 6 5

    则output是30


    2. 问题求解

    这是一个典型的动态规划求解问题。

    代码如下:

    #include <iostream>
    
    using namespace std;
    
    int getMax(int m, int n)
    {
    	return m>n?m:n;
    }
    
    int main()
    {
    	int road[100][100] = {0};
    	int n = 0;
    	cin >> n;
    	for(int i=0; i<n; i++) {
    		for (int j=0; j<=i; j++) {
    			cin >> road[i][j];
    		}
    	}
    	int dist[100][100] = {0};
    	dist[0][0] = road[0][0];
    	for(int i=1; i<n; i++) {
    		dist[i][0] = dist[i-1][0]+road[i][0];
    	}
    	for(int i=1; i<n; i++) {
    		dist[i][i] = dist[i-1][i-1]+road[i][i];
    	}
    	for(int i=2; i<n; i++) {
    		for(int j=1; j<n-1; j++) {
    			dist[i][j] = getMax(dist[i-1][j-1], dist[i-1][j])+road[i][j];
    		}
    	}
    	int maxSum = 0;
    	for(int i=0; i<n; i++) {
    		if(dist[n-1][i]>maxSum) maxSum = dist[n-1][i];
    	}
    	cout << maxSum << endl;
    	return 0;
    }

    动态规划的思想就是在求解的过程中要用到子问题,需要保存子问题的解,用空间换时间。

     



    展开全文
  • 数字三角形问题描述小Hi和小Ho在经历了螃蟹先生任务之后被奖励了一次出国旅游机会,于是他们来到了大洋彼岸美国。美国人民生活非常有意思,经常会有形形色色、奇奇怪怪活动举办,这不,小Hi和小Ho刚刚下...

    数字三角形

    问题描述

    小Hi和小Ho在经历了螃蟹先生的任务之后被奖励了一次出国旅游的机会,于是他们来到了大洋彼岸的美国。美国人民的生活非常有意思,经常会有形形色色、奇奇怪怪的活动举办,这不,小Hi和小Ho刚刚下飞机,就赶上了当地的迷宫节活动。迷宫节里展览出来的迷宫都特别的有意思,但是小Ho却相中了一个其实并不怎么像迷宫的迷宫——因为这个迷宫的奖励非常丰富~

    于是小Ho找到了小Hi,让小Hi帮助他获取尽可能多的奖品,小Hi把手一伸道:“迷宫的介绍拿来!”

    小Ho选择的迷宫是一个被称为“数字三角形”的n(n不超过200)层迷宫,这个迷宫的第i层有i个房间,分别编号为1..i。除去最后一层的房间,每一个房间都会有一些通往下一层的房间的楼梯,用符号来表示的话,就是从第i层的编号为j的房间出发会有两条路,一条通向第i+1层的编号为j的房间,另一条会通向第i+1层的编号为j+1的房间,而最后一层的所有房间都只有一条离开迷宫的道路。这样的道路都是单向的,也就是说当沿着这些道路前往下一层的房间或者离开迷宫之后,小Ho没有办法再次回到这个房间。迷宫里同时只会有一个参与者,而在每个参与者进入这个迷宫的时候,每个房间里都会生成一定数量的奖券,这些奖券可以在通过迷宫之后兑换各种奖品。小Ho的起点在第1层的编号为1的房间,现在小Ho悄悄向其他参与者弄清楚了每个房间里的奖券数量,希望小Hi帮他计算出他最多能获得多少奖券。
    输入
    每个测试点(输入文件)有且仅有一组测试数据。

    每组测试数据的第一行为一个正整数n,表示这个迷宫的层数。

    接下来的n行描述这个迷宫中每个房间的奖券数,其中第i行的第j个数代表着迷宫第i层的编号为j的房间中的奖券数量。

    测试数据保证,有100%的数据满足n不超过100

    对于100%的数据,迷宫的层数n不超过100

    对于100%的数据,每个房间中的奖券数不超过1000

    对于50%的数据,迷宫的层数不超过15(小Ho表示2^15才3万多呢,也就是说……)

    对于10%的数据,迷宫的层数不超过1(小Hi很好奇你的边界情况处理的如何?~)

    对于10%的数据,迷宫的构造满足:对于90%以上的结点,左边道路通向的房间中的奖券数比右边道路通向的房间中的奖券数要多。

    对于10%的数据,迷宫的构造满足:对于90%以上的结点,左边道路通向的房间中的奖券数比右边道路通向的房间中的奖券数要少。

    输出
    对于每组测试数据,输出一个整数Ans,表示小Ho可以获得的最多奖券数。

    样例输入
    5
    2
    6 4
    1 2 8
    4 0 9 6
    6 5 5 3 6
    样例输出
    28

    问题分析

    典型的动态规划题,该问题存在两个特征,无后效性和重复子问题
    无后效性:无论我是通过怎么样的方式到达第i层第j个房间的,我之前做出的选择不会对我之后的选择做出限制与优待。所谓的限制与优待指的是不会有走法的次数限制
    重复子问题:<3,2>这个房间会被<2,1>和<2,2>计算两次,这就是重复子问题。

    综合两个子问题,我们用best(i,j)表示到达

    AC代码

    import java.util.Scanner;
    
    /**
     * Created by Jason on 2016/4/13.
     */
    public class Main {
    
        public static int getMaxValue(int[][] values,int size) {
            int maxValue = 0;
            int[][] best = new int[size][size];
            best[0][0] = values[0][0];
            for (int i=1;i<size;i++) {
                for (int j=0;j<=i;j++) {
                    if (j==0) {
                        best[i][j] = best[i-1][j] + values[i][j];
                    } else if (j==i) {
                        best[i][j] = best[i-1][j-1] + values[i][j];
                    } else {
                        best[i][j] = Math.max(best[i-1][j-1],best[i-1][j]) + values[i][j];
                    }
                }
            }
            for (int i=0;i<size;i++) {
                if (best[size-1][i]>maxValue) {
                    maxValue = best[size-1][i];
                }
            }
            return maxValue;
        }
    
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int size = scanner.nextInt();
            int[][] matrix = new int[size][size];
            for (int i=0;i<size;i++) {
                for (int j=0;j<=i;j++) {
                    matrix[i][j] = scanner.nextInt();
                }
            }
            System.out.println(getMaxValue(matrix,size));
        }
    
    }
    

    代码链接:
    https://github.com/lincolnmi/hihoCoder/blob/master/src/Hi_1037/DigitalTriangle.java

    展开全文
  • hiho 1037 : 数字三角形

    2018-02-23 12:46:19
    #1037 : 数字三角形时间限制:10000ms单点时限:1000ms内存限制:256MB问题描述小Hi和小Ho在经历了螃蟹先生任务之后被奖励了一次出国旅游机会,于是他们来到了大洋彼岸美国。美国人民生活非常有意思,经常会有...
  • 1. 问题描述 有一个这样的数字三角形:  7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 ...Input第1 行是数字三角形的行数n,1<= n <=100。 接下来n行是数字三角形各...
  • hiho 5 数字三角形

    2015-11-01 23:22:13
    描述 小Hi和小Ho在经历了螃蟹先生任务之后被...迷宫节里展览出来迷宫都特别有意思,但是小Ho却相中了一个其实并不怎么迷宫迷宫——因为这个迷宫奖励非常丰富~ 于是小Ho找到了小Hi,让小Hi帮助他获取尽
  • 数字三角形(dp)

    2018-08-02 11:03:32
    问题描述 小Hi和小Ho在经历了螃蟹先生...迷宫节里展览出来迷宫都特别有意思,但是小Ho却相中了一个其实并不怎么迷宫迷宫——因为这个迷宫奖励非常丰富~ 于是小Ho找到了小Hi,让小Hi帮助他获取尽可能...
  • 数字三角形 (dp)

    2018-08-01 15:36:01
     问题描述  小Hi和小Ho在经历了螃蟹先生任务之后被奖励了一...迷宫节里展览出来迷宫都特别有意思,但是小Ho却相中了一个其实并不怎么迷宫迷宫——因为这个迷宫奖励非常丰富~  于是小Ho找到了小Hi...
  • 问题描述 小Hi和小Ho在经历了螃蟹先生任务之后...迷宫节里展览出来迷宫都特别有意思,但是小Ho却相中了一个其实并不怎么迷宫迷宫——因为这个迷宫奖励非常丰富~ 于是小Ho找到了小Hi,让小Hi帮助他获取尽...
  • hihocoder--数字三角形

    2014-10-29 10:01:06
    问题描述 小Hi和小Ho在经历了螃蟹先生任务...迷宫节里展览出来迷宫都特别有意思,但是小Ho却相中了一个其实并不怎么迷宫迷宫——因为这个迷宫奖励非常丰富~ 于是小Ho找到了小Hi,让小Hi帮助他获取尽可能
  • 题目1 : 数字三角形

    2014-08-04 15:18:54
    问题描述 小Hi和小Ho在经历了螃蟹先生任务...迷宫节里展览出来迷宫都特别有意思,但是小Ho却相中了一个其实并不怎么迷宫迷宫——因为这个迷宫奖励非常丰富~ 于是小Ho找到了小Hi,让小Hi帮助他获取尽可能
  • 问题描述 小Hi和小Ho在经历了螃蟹先生任务之后被奖励了一...迷宫节里展览出来迷宫都特别有意思,但是小Ho却相中了一个其实并不怎么迷宫迷宫——因为这个迷宫奖励非常丰富~ 于是小Ho找到了小Hi,让小H...
  • 数字三角形(简单dp)

    2018-03-12 12:41:15
    时间限制:10000ms单点时限:1000ms内存限制:256MB问题描述小Hi和小Ho在经历了螃蟹先生任务之后被...迷宫节里展览出来迷宫都特别有意思,但是小Ho却相中了一个其实并不怎么迷宫迷宫——因为这个迷宫奖励...
  • 链接 问题描述 小Hi和小Ho在经历了螃蟹先生...迷宫节里展览出来迷宫都特别有意思,但是小Ho却相中了一个其实并不怎么迷宫迷宫——因为这个迷宫奖励非常丰富~ 于是小Ho找到了小Hi,让小Hi帮助他获取尽...
  • 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 问题描述 小Hi和小Ho在经历了螃蟹先生任务之后被奖励了一次...迷宫节里展览出来迷宫都特别有意思,但是小Ho却相中了一个其实并不怎么迷宫迷宫——因为
  • 问题描述 小Hi和小Ho在经历了螃蟹先生任务之后...迷宫节里展览出来迷宫都特别有意思,但是小Ho却相中了一个其实并不怎么 迷宫迷宫——因为这个迷宫奖励非常丰富~ 于是小Ho找到了小Hi,让小Hi帮助他获取
  • 问题描述小Hi和小Ho在经历了螃蟹先生...迷宫节里展览出来迷宫都特别有意思,但是小Ho却相中了一个其实并不怎么迷宫迷宫——因为这个迷宫奖励非常丰富~于是小Ho找到了小Hi,让小Hi帮助他获取尽可能多奖品...
  • 问题描述 小Hi和小Ho在经历了螃蟹先生...迷宫节里展览出来迷宫都特别有意思,但是小Ho却相中了一个其实并不怎么迷宫迷宫——因为这个迷宫奖励非常丰富~ 于是小Ho找到了小Hi,让小Hi帮助他获取尽可能...
  • 动态规划----数字三角形

    千次阅读 2006-11-05 10:53:00
    描述:有一个这样的数字三角形: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5从顶点开始,每个数字向下层走只能有左下和...算法和思路:设三角形的行数为level (level = (sqrt(1 + 8 * LENGTH) - 1) /
  • 问题描述 小Hi和小Ho在经历了螃蟹先生...迷宫节里展览出来迷宫都特别有意思,但是小Ho却相中了一个其实并不怎么迷宫迷宫——因为这个迷宫奖励非常丰富~ 于是小Ho找到了小Hi,让小Hi帮助他获取尽可能...
  • 问题描述 小Hi和小Ho在经历了螃蟹先生任务之后被...迷宫节里展览出来迷宫都特别有意思,但是小Ho却相中了一个其实并不怎么迷宫迷宫——因为这个迷宫奖励非常丰富~ 于是小Ho找到了小Hi,让小Hi帮助他获
  • 1、先是看到手机上有个小游戏,填游戏,横竖相连,个迷宫 2、就用Delphi 做了个由 panel 数组 组成迷宫,墙都是方块,丑死了。 3、再查查网上有不少迷宫样式,其中有迷宫是单墙,而且任意两处都是想通。...
  • 问题描述 小Hi和小Ho在经历了螃蟹先生...迷宫节里展览出来迷宫都特别有意思,但是小Ho却相中了一个其实并不怎么迷宫迷宫——因为这个迷宫奖励非常丰富~ 于是小Ho找到了小Hi,让小Hi帮助他获取尽可能...
  • 小Hi和小Ho在经历了螃蟹先生任务...迷宫节里展览出来迷宫都特别有意思,但是小Ho却相中了一个其实并不怎么迷宫迷宫——因为这个迷宫奖励非常丰富~ 于是小Ho找到了小Hi,让小Hi帮助他获取尽可能多奖品
  • 原址链接 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 问题描述 小Hi和小Ho在经历了螃蟹先生任务之后被奖励了...迷宫节里展览出来迷宫都特别有意思,但是小Ho却相中了一个其实并不怎么迷宫迷宫——...
  • 大提琴声音就一条河,左岸是我无法忘却回忆,右岸是我值得紧握璀璨年华,中间流淌,是我年年岁岁淡淡感伤 #include <iostream> #include <cstdio> #include <algorithm> #include...
  • 我想在程序中把选项卡以下案例显示,选项卡图像下面有一个小三角形。有实现方法吗?使用代码或文字形式都可以。 ![enter image description here][1] [1]: http://i.stack.imgur.com/x28hG.png

空空如也

空空如也

1 2 3 4 5 6
收藏数 119
精华内容 47
关键字:

像三角形的字