记忆化搜索算法(MemorySearch)显示路径的问题
Posted 冲刺算法竞赛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记忆化搜索算法(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;
}
以上是关于记忆化搜索算法(MemorySearch)显示路径的问题的主要内容,如果未能解决你的问题,请参考以下文章
ZOJ3795 Grouping(强连通分量+缩点+记忆化搜索)