• 数字三角形


    程序设计导引及在线实践

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

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


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

  • 相关阅读:
    Linux sort -n 与 -g 排序对比
    shell中IF的用法介绍
    Firewalld 用法解析
    Centos7最小化安装后再安装图形界面
    PXE无人值守部署centos7.4操作系统
    kali之获取靶机的图片和看的url
    Kali的源得数字验证问题
    kali之Nmap (Network Mapper(网络映射器)
    kali之EtterCap学习
    Kali linux查看局域网内其他用户的输入信息
  • 原文地址:https://www.cnblogs.com/cute/p/15263222.html
Copyright © 2020-2023  润新知