dp问题之数字三角形问题(老师讲课例题)

dp问题之数字三角形问题(老师讲课例题)
数字三角形问题:

               7

              3 8

             8 1 0

            2 7 7 4

           5 5 2 6 5

示出了一个数字三角形宝塔。数字三角形中的数字为不超过100的正整数。现规定从最顶层走到最底层,每一步可沿左斜线向下或右斜线向下走。假设三角形行数≤100,编程求解从最顶层走到最底层的一条路径,使得沿着该路径所经过的数字的总和最大,输出最大值。输人数据:由文件输入数据,文件第一行是三角形的行数N。以后的N行分别是从最顶层到最底层的每一层中的数字。
如输入: 5
7           
3 8         
8 1 0     
2 7 7 4     
4 5 2 6 5   
输出:30

【分析】对于这一问题,很容易想到用枚举的方法(深度搜索法)去解决,即列举出所有路径并记录每一条路径所经过的数字总和,然后寻找最大的数字总和


  1#include<stdio.h>
  2#include<stdlib.h>
  3#include<iostream>
  4using namespace std;
  5#define MAX 100
  6int a[MAX][MAX];
  7int f[MAX][MAX];
  8int map[MAX][MAX];
  9int main()
 10{
 11    int i,j,n,min;
 12    while(scanf("%d",&n)!=EOF)
 13    {
 14        int c,b=n;
 15        /**//*以下为输入方式*/
 16        for(i=1;i<=n;i++)
 17        {
 18            for(j=1;j<=i;j++)
 19            {
 20                scanf("%d",&a[i][j]);
 21                f[i][j]=a[i][j];
 22            }

 23        }

 24        //初始化f[1][1];
 25        f[1][1]=a[1][1];
 26        //为表图做标记;
 27        for(i=2;i<=n;i++)
 28        {
 29            
 30            f[i][1]=f[i-1][1]+a[i][1];
 31            map[i][0]=0;
 32            f[i][i]=f[i-1][i-1]+a[i][i];
 33            map[i][i]=1;
 34        }

 35        /**//*动态规划选出最优解
 36        状态方程组:f[i][j]=min(f[i-1][j]+a[i][j],f[i-1][j-1],a[i][j])
 37        */

 38        for(i=3;i<=n;i++)
 39        {
 40            for(j=2;j<=i-1;j++)
 41            {
 42                f[i][j]=f[i-1][j-1]+a[i][j];
 43                map[i][j]=1;
 44                if(f[i][j]>(f[i-1][j]+a[i][j]))
 45                {
 46                    f[i][j]=f[i-1][j]+a[i][j];
 47                    map[i][j]=0;
 48
 49                }

 50            }

 51        }

 52        //选出最优解
 53        min=f[n][n];
 54        for(i=1;i<n;i++)
 55        {
 56            if(f[n][i]<min)
 57            {
 58                min=f[n][i];
 59                c=n;
 60                b=i;
 61            }

 62
 63        }

 64        //以下为输出
 65        printf("%d\n",min);
 66        for(i=1;i<=n;i++)
 67        {
 68            for(j=1;j<=i;j++)
 69            {
 70                if(map[i][j]==0)
 71                    printf("");
 72                else if(map[i][j]==1)
 73                        printf("\\ ");
 74                    else
 75                {
 76                    printf("  ");
 77                }

 78            }

 79            printf("\n");
 80        }

 81        //倒序输出所有选中项a[i][j]
 82        printf("倒序输出所选中的a[i][j]有:");
 83        while(c!=1||b!=1)
 84        {
 85            printf("%d ",a[c][b]);
 86            if(map[c][b]==0)
 87            {
 88                c=c-1;
 89            }

 90            else if(map[c][b]==1)
 91            {
 92                c=c-1;
 93                b=b-1;
 94            }

 95        }

 96        printf("%d\n",a[1][1]);
 97
 98    }
    
 99return 0;
100}




你可能感兴趣的:(dp问题之数字三角形问题(老师讲课例题))