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;
    }

  • 相关阅读:
    Oracle/PLSQL: RTRIM Function-from cyber
    Oracle/PLSQL: LTRIM Function-from cyber
    Oracle AnyData Data Type Version 11.1-from cyber
    用 Sqlplus 创建用户的详细步骤 (centos 6.0,Oracle 11g)
    SQL_Plus操作命令-引自网络
    Linux下scp的用法-引自网络
    非学习型单层感知机的java实现(日志三)
    N维法向量与N维超平面的关系的简单证明(日志二)
    R语言分析(二)——薛毅R语言第二章后面习题解析
    R语言分析(一)-----基本语法
  • 原文地址:https://www.cnblogs.com/cute/p/15263222.html
Copyright © 2011-2022 走看看