• 深搜




    7
    3   8
    8   1   0
    2   7   4   4
    4   5   2   6   5
    
    (图1)

    图1给出了一个数字三角形。
    从指定的一个数往下走,可以走到下一层上和它最近的左边的那个数或者右边的那个数。
    任务:
    给定数字三角形中的一个位置,求从它开始所能到达的最大数 输入 输入数据包含多组测试数据,

    对于每组测试数据:
    输入的第一行是一个整数N (0 <= N <= 100),给出三角形的行数。
    (当N为0时,表示测试结束,你不需要处理本组数据)
    下面的N行给出数字三角形。数字三角形上的数的范围都在0和100之间。
    接下来一行有两个数,R和C,表示起始点位于第R行第C个位置。
    输出 输出若干行,每行对应一组测试数据的结果。 样例输入
    1
    2
    1 1
    5
    7
    3 8
    8 1 0 
    2 7 4 4
    4 5 2 6 5
    1 1
    6
    88 
    97 26 
    39 16 47 
    94 25 66 4 
    64 49 20 36 27 
    37 87 29 37 10 40 
    2 1
    0
    样例输出
    2
    8
    97


    这道题是上次选拔赛的题,应该是老师新出的题,所以百度上一直没有找到题解,刚刚问了一下过了的同学才知道,自己的解题思路完全有问题,问题所在居然是题理解错了,想得太简单,然而这道题要用到深搜的思想来做。。

    下面是代码:

    #include<cstdio>
    using namespace std;
    const int MAXN=100;
    int a[MAXN][MAXN];
    bool used[MAXN][MAXN];
    int dir[2][2]={1,0,1,1};
    int ans;
    int n;
    void dfs(int x,int y)
    {
    	used[x][y]=true;
    	for(int i=0;i<2;i++)
    	{
    		int nx=x+dir[i][0];
    		int ny=y+dir[i][1];
    		if(nx>=0 && nx<n && ny>=0 && ny<n && nx>=ny)
    		{
    			if(a[nx][ny]>ans)
    			{
    				ans=a[nx][ny];
    			}
    			if(!used[nx][ny])
    				dfs(nx,ny);
    		} 
    	}
    }
    int main()
    {
    	while(~scanf("%d",&n)&&n)
    	{
    		for(int i=0;i<n;i++)
    		{
    			for(int j=0;j<=i;j++)
    			{
    				scanf("%d",&a[i][j]);
    				used[i][j]=false;
    			}
    		}
    		int x,y;
    		scanf("%d%d",&x,&y);
    		ans=a[x-1][y-1];
    		dfs(x-1,y-1);
    		printf("%d
    ",ans);
    	}
    	return 0;
    }



    7
    3   8
    8   1   0
    2   7   4   4
    4   5   2   6   5
    
    (图1)

    图1给出了一个数字三角形。
    从指定的一个数往下走,可以走到下一层上和它最近的左边的那个数或者右边的那个数。
    任务:
    给定数字三角形中的一个位置,求从它开始所能到达的最大数。 输入 输入数据包含多组测试数据,

    对于每组测试数据:
    输入的第一行是一个整数N (0 <= N <= 100),给出三角形的行数。
    (当N为0时,表示测试结束,你不需要处理本组数据)
    下面的N行给出数字三角形。数字三角形上的数的范围都在0和100之间。
    接下来一行有两个数,R和C,表示起始点位于第R行第C个位置。
    输出 输出若干行,每行对应一组测试数据的结果。 样例输入
    1
    2
    1 1
    5
    7
    3 8
    8 1 0 
    2 7 4 4
    4 5 2 6 5
    1 1
    6
    88 
    97 26 
    39 16 47 
    94 25 66 4 
    64 49 20 36 27 
    37 87 29 37 10 40 
    2 1
    0
    样例输出
    2
    8
    97
  • 相关阅读:
    树形DP,最大直径,并查集——HDU4514
    树形DP——HDU2196
    树上倍增法,LCA——CF-832-D
    LCA,Tarjan——POJ1330
    树的直径,树形DP,DFS——POJ1958
    剑指offer28-最小k个数
    剑指offer27-数组中出现次数超过一半的数字
    剑指offer26-字符串的排列
    剑指offer25-二叉搜索树与双向链表
    剑指offer24-复杂链表的复制
  • 原文地址:https://www.cnblogs.com/qie-wei/p/10160254.html
Copyright © 2020-2023  润新知