zoukankan      html  css  js  c++  java
  • 记忆化搜索算法(MemorySearch)显示路径的问题

    本人小白但是最近学习了动态规划的记忆化搜索算法,就是经典的那道数字三角形的题,题目中最后说的只是要显示最大路径的值(就是求和),没说要求走过的点的坐标,我想顺便输出坐标,有没有什么高效的算法?我目前想出来一种(效率可能很低),就是用一开始记录到底的值的数组d来求,遍历每一行的d,求其的最大值然后记录下坐标。但是我觉得可以通过边搜边记录边筛的方式来弄。

    一下是我尝试后者的代码

    #include<iostream>
    #include<algorithm>
    using namespace std;
    int d[107][107],a[107][107],n,njc,Roadx[100],Roady[100],Road_jc=1;
    void PrintRoad(){
    for(int i=1;i<=Road_jc;i++){
    cout<<"第"<<i<<"组是"<<"("<<Roadx[i]<<","<<Roady[i]<<")"<<endl;
    }
    }
    void Get_Road(int a,int b){
    Roadx[Road_jc]=a;
    Roady[Road_jc]=b;
    Road_jc++;
    }
    void Get_Putin(){
    for(int wjc=1;wjc<=n;wjc++){
    njc=1;
    for(int njc=1;njc<=wjc;njc++){
    cin>>a[wjc][njc];
    d[wjc][njc]=0;
    }
    }
    }
    int dfs(int x,int y){
    if(d[x][y]!=0){
    return d[x][y];
    }
    if(d[x][y]==0){
    d[x][y]=a[x][y]+max(dfs(x+1,y),dfs(x+1,y+1));
    if(dfs(x+1,y)>=dfs(x+1,y+1))Get_Road(x+1,y);
    else Get_Road(x+1,y+1);
    return d[x][y];
    }
    }
    void Start_Chu(){
    for(int jc=1;jc<=n;jc++)d[n][jc]=a[n][jc];
    }
    void De_Bug(){
    for(int wjc=1;wjc<=n;wjc++){
    njc=1;
    for(int njc=1;njc<=wjc;njc++){
    cout<<"a["<<wjc<<"]"<<"["<<njc<<"]"<<a[wjc][njc]<<" ";
    cout<<"d["<<wjc<<"]"<<"["<<njc<<"]"<<d[wjc][njc]<<" ";
    cout<<endl;
    }
    }
    }
    int main(){
    cin>>n;
    Get_Putin();
    Start_Chu();
    cout<<dfs(1,1)<<endl;
    PrintRoad();
    system("pause");
    return 0;
    }

  • 相关阅读:
    Excel催化剂图表系列之品味IBCS瀑布图观察企业利润构成
    Excel催化剂图表系列之一键完成IBCS国际商业标准图表
    transfer-webpack-plugin最简使用示例
    将本地目录上传值git仓库
    webpack最简示例
    git的sshkey生成步骤
    从iconfont下载项目所需的图标资源
    html5的video标签自动播放
    windows下配置apache+php环境
    win10下配置php环境变量
  • 原文地址:https://www.cnblogs.com/xiazai/p/8999140.html
Copyright © 2011-2022 走看看