• 练习之<求最大路径>


    题目描述:

    已知一个斜三角:
    22 32 14 77 45
        12 34 37 23
             44 23 15
                 34 54
                      88
    从最左上角元素开始往右或往右下走,请问顺着哪条路所经过的值的总和最大,
    如可以有路线:22,32,34,23,54 ; 22,12,44,34,88等等
    请求出满足值总和最大的那条线路。

    View Code
     1 void Func(int a[],int n)
    2 {
    3 int *b = new int[n]; //记录从某个节点开始最大路径上的下一个节点
    4 int *c = new int[n]; //记录从某个节点开始最大路径的长度
    5 for(int k=0; k<n; k++)
    6 {
    7 b[k]=c[k]=0;
    8 }
    9 cout<<"最大路径长度是:"<<MaxWay(a,0,0,b,c)<<endl;//记录最长路径
    10 Print(a,b,c);//输出最长路径
    11 delete b;
    12 delete c;
    13 }
    14
    15 int MaxWay(int a[], int i, int j, int b[], int c[])
    16 {
    17 int temp=j*(j+1)/2+i;//计算下标 //temp=(10-i)*(i+1)/2+j-5;
    18 if(c[temp]!=0)
    19 {//若某节点已经求过最大路径则退出,防止重复计算
    20 return c[temp];
    21 }
    22 if(i==4 || j==4)//到达数组边界
    23 {
    24 b[temp]=-1;
    25 c[temp]=a[temp];
    26 return a[temp];
    27 }
    28 int temp1=MaxWay(a,i,j+1,b,c);
    29 int temp2=MaxWay(a,i+1,j+1,b,c);
    30 if(temp1>temp2)//寻找从当前节点开始最大路径
    31 {
    32 b[temp]=a[(j+1)*(j+1+1)/2+i];//记录从当前节点开始最大路径上当前节点的下一个节点
    33 c[temp]=temp1;//记录从当前节点开始最大路径长度
    34 return a[temp]+temp1;
    35 }
    36 else
    37 {
    38 b[temp]=a[(j+1)*(j+1+1)/2+i+1];
    39 c[temp]=temp2;
    40 return a[temp]+temp2;
    41 }
    42 }
    43
    44 void Print(int a[],int b[], int c[])
    45 {//输出最大路径,从第一个节点开始沿着b中的值输出最长的路径
    46 int i=0,j=0;
    47 int temp=j*(j+1)/2+i;
    48 cout<<"最大路径是:"<<endl;
    49 cout<<a[temp]<<" ";
    50 while(b[temp]!=-1)
    51 {
    52 if(b[temp]==a[(j+1)*(j+1+1)/2+i])
    53 {
    54 cout<<b[temp]<<" ";
    55 j++;
    56 }
    57 else if(b[temp]==a[(j+1)*(j+1+1)/2+i+1])
    58 {
    59 cout<<b[temp]<<" ";
    60 i++;
    61 j++;
    62 }
    63 temp=j*(j+1)/2+i;
    64 }
    65 cout<<endl;
    66 }
    67
    68 int main()
    69 {
    70 int a[15]={22,32,12,14,34,44,77,37,23,34,45,23,15,54,88};//以列优先存储上三角矩阵
    71 // EnableMemLeakCheck();
    72 Func(a,15);
    73 return 0;
    74 }



  • 相关阅读:
    电磁学讲义3:电场
    电磁学讲义2:库仑定律
    电磁学讲义1:静电的基本现象
    安卓(Android)手机如何安装APK?
    理论物理极础9:相空间流体和吉布斯-刘维尔定理
    物理学家的LOGO
    Zhulina 的高分子刷理论
    一步一步学Silverlight 2系列(5):实现简单的拖放功能
    地图上显示X,Y 坐标代码
    一步一步学Silverlight 2系列(4):鼠标事件处理
  • 原文地址:https://www.cnblogs.com/landy126/p/2371824.html
Copyright © 2020-2023  润新知