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

  • 相关阅读:
    Codevs 2296 仪仗队 2008年省队选拔赛山东
    Codevs 1535 封锁阳光大学
    Codevs 1069 关押罪犯 2010年NOIP全国联赛提高组
    Codevs 1218 疫情控制 2012年NOIP全国联赛提高组
    Codevs 1684 垃圾陷阱
    洛谷 P1108 低价购买
    Vijos P1325桐桐的糖果计划
    Codevs 3289 花匠 2013年NOIP全国联赛提高组
    Codevs 2611 观光旅游(floyed最小环)
    C语言基础之彩色版C语言(内含linux)
  • 原文地址:https://www.cnblogs.com/xiazai/p/8999140.html
Copyright © 2011-2022 走看看