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

    程序设计导引及在线实践

    第一种解法,直接递归,优化后,改为逆推动态规划

    打印路径,可以反过来计算。


    #include<iostream>
    using namespace std;
    #define MAX_NUM 100
    int A[MAX_NUM + 10][MAX_NUM + 10];
    int D[MAX_NUM + 10][MAX_NUM + 10];
    int N;

    void print_path()
    {
         int i=1,j=1;
         printf("%d ", A[i][j]);
        
         for(i = 1; i < N; )
         {
             if(D[i][j]==D[i+1][j+1]+A[i][j])
                 j=j+1;
             i++;
             printf("%d ", A[i][j]);   
         }
         printf(" ");

    }
    int main()
    {
         int m;
         scanf("%d", &N);
         for( int i = 1; i <= N; i ++ )
             for( int j = 1; j <= i; j ++ )
                 scanf("%d", &A[i][j]);

        for(int i=1;i<=N;i++)
         {
             D[N][i]=A[N][i];
         }
         for(int i=N-1;i>=1;i--)
         {
             for( int j = 1; j <= i; j ++ )
                 D[i][j]=max(D[i+1][j], D[i+1][j+1]) + A[i][j];
         }
         printf("%d ", D[1][1]);
         print_path();   
         return 0;
    }


    另一种是计算时候就保存方向,加一个数组保存相关信息

    #include<iostream>
    using namespace std;
    #define MAX_NUM 100
    int A[MAX_NUM + 10][MAX_NUM + 10];
    int D[MAX_NUM + 10][MAX_NUM + 10];
    int dir[MAX_NUM + 10][MAX_NUM + 10];//保存方向
    int N;

    void print_path()
    {
         int i=1,j=1;
         printf("%d ", A[i][j]);
        
         for(i = 1; i < N; )
         {
             if(D[i][j]==D[i+1][j+1]+A[i][j])
                 j=j+1;
             i++;
             printf("%d ", A[i][j]);   
         }
         printf(" ");

    }


    void print_path2()
    {
         int i=1,j=1;
         //printf("%d ", A[i][j]);
        
         for(i = 1; i <=N; )
         {
             printf("%d ", A[i][j]);   
             j+=dir[i][j];
             i++;   
         }
         printf(" ");

    }
    int main()
    {
         int m;
         scanf("%d", &N);
         for( int i = 1; i <= N; i ++ )
             for( int j = 1; j <= i; j ++ )
                 scanf("%d", &A[i][j]);

        for(int i=1;i<=N;i++)
         {
             D[N][i]=A[N][i];
         }
         for(int i=N-1;i>=1;i--)
         {
             for( int j = 1; j <= i; j ++ )
             {
                 if(D[i+1][j] > D[i+1][j+1])
                 {
                     D[i][j]=D[i+1][j] + A[i][j];
                     dir[i][j]=0;
                 }
                 else
                 {
                     D[i][j]=D[i+1][j+1] + A[i][j];
                     dir[i][j]=1;    
                 }
                
             }
                
         }
         printf("%d ", D[1][1]);
         print_path();
         print_path2();   
         return 0;
    }

  • 相关阅读:
    mysql基础 MySql反向模糊查询
    mysql基础 函数
    html 标签的自定义属性应用
    mysql 分组后查询总行数,不使用子查询
    mysql基础 利用正则表达式判断数字
    网络工程师 教材目录
    Quatris
    BaseApplication Framework的skdCameraMan SdkTrayManager分析
    效率问题节点删除等
    ManulObject Ogre::RenderOperation::OT_TRIANGLE_STRIP
  • 原文地址:https://www.cnblogs.com/cute/p/15263222.html
Copyright © 2011-2022 走看看