备忘录方法

实验任务单

实验主题:备忘录方法

  1. 实验目的
    1. 掌握动态规划与备忘录方法的相同与不同。
    2. 理解备忘录方法的思想和实现。
  2. 实验任务

数字三角形路径问题:给定等腰直角数字三角形,请确定从顶至底的某个位置的一条路径,使该路径所经过的数字的总和最大。假设每一步可延直线向下或右斜线向下走。

使用备忘录方法解决数字三角形问题,求解最大数字和、以及其对应的路径。求解将程序粘贴到方框中。

 

#include <string.h>

#include <stdlib.h>

#include <stdio.h>

#include <iostream>

using namespace std;

const int M=5;//数字下三角的行列数

int v[M][M];//数字三角的值

int m[M][M];//从数字三角的(0,0)至(M-1,M-1)的最大和

int lookuptriag(int i,int j)

{

    int u1,u2;

    if(m[i][j]>0){

       return m[i][j];

    }

    if(i==0&&j==0){

       return m[i][j]=v[i][j];

       if(i==j)

        {

           cout<<i<<j<<m[i][j]<<endl;

           m[i][j]=lookuptriag(i-1,j-1)+v[i][j];

           return m[i][j];

       }

       else{

           if(i>j)

           {

              if(i!=0&&j==0)

              {

                  m[i][j]=lookuptriag(i-1,j)+v[i][j];

                  cout<<i<<j<<m[i][j]<<endl;

              }

              else

              {

                  u1=lookuptriag(i-1,j);

                  u2=lookuptriag(i,j-1);

                  m[i][j]=u1>u2?u1+v[i][j]:v[i][j];

                  /*if(u1>=u2)

                  {

                  m[i][j]=u1+v[i][j];

                  cont<<i<<j<<m[i][j]<<endl;

              }

              else

              {

              m[i][j]=u2+v[i][j];

              cont<<i<<j<<m[i][j]<<endl;

           }*/

           return m[i][j];

       }

    }

   

}

}

}

void TrackSolution(int i,int j)

{

    printf("%d,%d\n",i,j);

    while(i!=0||j!=0)

    {

       if(i==0)

       {

           j--;

           printf("%d,%d\n",i,j);

       }

       else{

           if(j==0)

           {

              i--;

              printf("%d,%d\n",i,j);

           }

           else{

              if(m[i-1][j]>=m[i][j-1])

              {

                  i--;

                  printf("%d,%d\n",i,j);

              }else

              {

                  j--;

                  printf("%d,%d\n",i,j);

              }

           }

       }

    }

}

int main(){

    int i,j,start,end,t,count;

    printf("随机数生成数字三角形如下:\n");

    for(i=0;i<M;i++)

    {

       for(j=0;j<=1;j++)

       {

           v[i][j]=rand()%10;

           m[i][j]=-1;

           printf("%d\t",v[i][j]);       

       }

       printf("\n");

    }

    count=lookuptriag(M-1,M-1);

    printf("备忘录m三角形如下:\n");

    for(i=0;i<M;i++)

    {

       for(j=0;j<=1;j++)

       {

           printf("%d\t",m[i][j]);

       }

       printf("\n");

    }

    printf("TrackSolution(追踪解)如下:\n");

    TrackSolution(M-1,M-1);

    return 1;

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值