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

  • 相关阅读:
    CCF-CSP的第三题们么
    STL
    信息安全-期末复习
    NLP自然语言处理
    python 处理文件
    信息安全-简易的DES加解密--3DES
    试药的常见问题
    关于试药的那些事
    Excel的单列和多列的拆分与合并
    Excel中的文本提取操作
  • 原文地址:https://www.cnblogs.com/xiazai/p/8999140.html
Copyright © 2011-2022 走看看