欢聚时代笔试题

1.输入一个矩阵,从左上角走到右下角:向右、向下可以走, 向下优先,找出最短路径,需要输出走过的位置
我用backtracking加剪枝只能通过40%,可能用动态规划更好,但不知道动态规划怎么保存路径,有大神做出来了吗,求教
#include <iostream>
#include <vector>
#include <algorithm>

vector<vector<int>> shared;

void backtracking(vector<vector<int>> &board,vector<vector<int>> &prune, int x, int y, int n, int m, int sum, int &res, vector<vector<int>> tra){
    if(x<0||x>=m || y<0||y>=m)
        return ;
    if(sum>=res) return ;

    if(x==n-1 && y==m-1){
        if(sum<res){
            res=sum;
            shared=tra;
        }
    }
    sum+=board[x][y];
    if(sum>prune[x][y]) return;
    else prune[x][y]=sum;
    tra.push_back({x,y});
    backtracking(board,prune,x+1,y,n,m,sum,res,tra);
    backtracking(board,prune,x,y+1,n,m,sum,res,tra);
}
int main(){
    int m,n;
    cin>>n>>m;
    vector<vector<int>> prune(n,vector<int>(m,INT_MAX));
    vector<vector<int>> board(n,vector<int>(m,0));
    for(int i=0;i<n; i++)
        for(int j=0;j<m;j++)
            cin>>board[i][j];
    int res=INT_MAX;
    vector<vector<int>> start;
    backtracking(board,prune,0,0,n,m,0,res,start);

    for(vector<vector<int>>::const_iterator vit=shared.begin();vit!=shared.end();vit++){
        vector<int> tmp=*vit;
        cout<<tmp[0]<<" "<<tmp[1]<<endl;
    }
    cout<<n-1<<" "<<m-1<<endl;
    return 0;
}


#欢聚集团##笔试题目#
全部评论
对于状态f(x,y),你多开个数组来记录最优决策,最后从终点倒着推回去就好啦。 (你会打印最短路径吗?一个原理
点赞 回复 分享
发布于 2019-09-12 20:49
你们是什么岗啊,为什么我做的都是简答题啊?
点赞 回复 分享
发布于 2019-09-12 20:51
动态规划调了半天有问题,改深搜过了🤣
点赞 回复 分享
发布于 2019-09-12 20:56
我也是40% 我第二题做了好久都是0% 我服了 只给简答留了10分钟 随便问一下简答5道 2MSL 数据库ACID 网络字节序 ? C++类型转换 第4道是啥来着 我弄死回忆不起来了 
点赞 回复 分享
发布于 2019-09-12 21:15
dp动态规划决策时不就是看它的上面或者左边嘛,所以你哪里转移过来的就记录一个pre就好了,然后从右下角倒着一直输出pre就好了
点赞 回复 分享
发布于 2019-09-12 21:22
两道题都是60%。。。服了
点赞 回复 分享
发布于 2019-09-12 22:25
Dp求出来最短路径的值,然后一步一步做减法,就能反推出来路径
点赞 回复 分享
发布于 2019-09-13 00:31

相关推荐

2024-12-26 13:00
太原理工大学 Java
会飞的猿:简历没啥大问题啊,感觉是缺少了实习经历。多投投先找个中小厂过渡一下吧
点赞 评论 收藏
分享
评论
1
5
分享

创作者周榜

更多
牛客网
牛客企业服务