zoukankan      html  css  js  c++  java
  • 01_数字三角形

    来源:刘汝佳《算法竞赛入门经典--训练指南》 P60 问题1:

    问题描述:有一个非负整数组成的三角形,第一行只有一个数,除了最下行之外,每个数的左下方和右下方各有一个数。从第一行的数开始,每次可以往左下或右下走一格,直到走到最下一行,把沿途经过的数全部加起来,如何走可使这个和最大?

    分析:对于三角形中的每个位置[i][j],以[i][j]为顶点的三角形的最大路径值只可能来自他左下方的数或者右下方的数

    设d[i][j]为从格子(i,j)出发能得到的最大和,则状态转移方程:

         d[i][j] = a[i][j] + Max{d[i+1][j] , d[i+1][j+1]};

    例题来源:http://acm.nyist.net/JudgeOnline/problem.php?pid=18

    代码实现:

     1  
     2 #include "stdio.h"
     3 #include "string.h"
     4 
     5 #define N 105
     6 
     7 int ans[N][N];
     8 
     9 inline int MAX(int a,int b){ return a>b?a:b; }
    10 
    11 int main()
    12 {
    13     int n;
    14     int i,j;
    15     while(scanf("%d",&n)!=EOF)
    16     {
    17         for(i=1; i<=n; ++i)
    18         {
    19             for(j=1; j<=i; ++j)
    20                 scanf("%d",&ans[i][j]);
    21         }
    22         for(i=n-1; i>=1; i--)
    23         {
    24             for(j=1; j<=i; ++j)
    25                 ans[i][j] += MAX(ans[i+1][j],ans[i+1][j+1]);
    26         }
    27         printf("%d
    ",ans[1][1]);
    28     }
    29     return 0;
    30 }
    31         
  • 相关阅读:
    pycharm初始配置
    个人Python笔记
    Linux硬盘分区
    Linux基础(三)
    Linux基础(二)
    linux基础之基本命令
    计算机网络基础
    计算机操作系统
    计算机基础
    vim编辑器
  • 原文地址:https://www.cnblogs.com/ruo-yu/p/4383492.html
Copyright © 2011-2022 走看看