华为笔试 华为ai算法笔试 华为秋招 1022

笔试时间:2025年10月22日

往年笔试合集:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题

在自动驾驶系统中,车道线识别是核心功能之一。车道线通常具有连续性,从图像左侧到右侧逐渐展开。为了识别出最可能的车道线路径,我们可以在图像中找到一条路径,使得路径上所有像素的信号值与策略矩阵的乘积之和最大。现定义每个位置的能量值为策略矩阵与该位置周边信号值的乘积和。

给定一个 H×W 的图像以及一个 K×K 的策略矩阵,用于模拟不同方向的路径选择策略。你需要从图像的第一列任意像素出发,走到最后一列任意像素,每一步只能向右、右上、右下移动一格。在行进的过程中,需要实时的收集能量值,请找到一条路径,使得路径上的能量值之和最大。

提示: 策略矩阵为奇数,边缘处用零填充

输入描述

第一行输入 H W K K,分别表示给定图像及策略矩阵的维度

接下来:

  • H 行输入图像矩阵
  • K 行输入策略矩阵

输出描述

输出最大能量值

样例输入

1 1 1 1

5

1

样例输出

5.0

样例说明:

有且仅有一条路径,最大能量值为 5.0

参考题解

解题思路:

这个问题可以分解为两个关键步骤:

  1. 计算能量图: 用策略矩阵对图像进行卷积,得到每个像素点的能量值 策略矩阵大小为K×K(K为奇数),相当于一个卷积核对图像每个位置(r,c),计算其周边K×K区域与策略矩阵的乘积和边缘位置采用补零处理这样得到H×W的能量图,其中每个值表示该位置在策略矩阵作用下的能量
  2. 动态规划找最优路径:状态定义:dp[r] 表示到达当前列第r行的最大累计能量状态转移:由于只能从左边、左上方、左下方三个方向过来: dp[r] = energy_map[r][c] + max(左边三个可能位置的最大值)具体来说:max(dp[r-1], dp[r], dp[r+1])(需要边界检查)

时间复杂度:O(H×W×K²) 用于能量图计算,O(H×W) 用于动态规划

C++:

#include <iostream>
#include <vector>
#include <iomanip>
#include <algorithm>
#include <cmath>
using namespace std;

int main() {
    int H, W, K, K2;
    cin >> H >> W >> K >> K2;
    
    vector<vector<int>> image(H, vector<int>(W));
    for (int i = 0; i < H; i++) {
        for (int j = 0; j < W; j++) {
            cin >> image[i][j];
        }
    }
    
    vector<vector<int>> kernel(K, vector<int>(K));
    for (int i = 0; i < K; i++) {
        for (int j = 0; j < K; j++) {
            cin >> kernel[i][j];
        }
    }
    
    // 计算能量图
    vector<vector<double>> energy_map(H, vector<double>(W, 0.0));
    int pad = (K - 1) / 2;
    
    for (int r = 0; r < H; r++) {
        for (int c = 0; c < W; c++) {
            double current_energy = 0.0;
            for (int i = 0; i < K; i++) {
                for (int j = 0; j < K; j++) {
                    int img_r = r + i - pad;
                    int img_c = c + j - pad;
                    int value = 0;
                    if (img_r >= 0 && img_r < H && img_c >= 0 && img_c < W) {
                        value = image[img_r][img_c];
                    }
                    current_energy += kernel[i][j] * value;
                }
            }
            energy_map[r][c] = current_energy;
        }
    }
    
    // 动态规划找最优路径
    vector<double> dp(H);
    for (int r = 0; r < H; r++) {
        dp[r] = energy_map[r][0];
    }
    
    for (int c = 1; c < W; c++) {
        vector<double> new_dp(H);
        for (int r = 0; r < H; r++) {
            double prev_max_energy = dp[r];
            if (r > 0) {
                prev_max_energy = max(prev_max_energy, dp[r - 1]);
            }
            if (r < H - 1) {
                prev_max_energy = max(prev_max_energy, dp[r + 1]);
            }
            new_dp[r] = energy_map[r][c] + prev_max_energy;
        }
        dp = new_dp;
    }
    
    double result = *max_element(dp.begin(), dp.end());
    cout << fixed << setprecision(1) << result << endl;
    
    return 0;
}

Java:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int H = sc.nextInt();
        int W = sc.nextInt();
        int K = sc.nextInt();
        int K2 = sc.nextInt();
        
        int[][] image = new int[H][W];
        for (int i = 0; i < H; i++) {
            for (int j = 0; j < W; j++) {
                image[i][j] = sc.nextInt();
            }
        }
        
        int[][] kernel = new int[K][K];
        for (int i = 0; i < K; i++) {
            for (int j = 0; j < K; j++) {
                kernel[i][j] = sc.nextInt();
            }
        }
        
        // 计算能量图
        double[][] energyMap = new double[H][W];
        int pad = (K - 1) / 2;
        
        for (int r = 0; r < H; r++) {
            for (int c = 0; c < W; c++) {
                double currentEnergy = 0.0;
                for (int i = 0; i < K; i++) {
                    for (int j = 0; j < K; j++) {
                        int imgR = r + i - pad;
                        int imgC = c + j - pad;
                        int value = 0;
                        if (imgR >= 0 && imgR < H && imgC >= 0 && imgC < W) {
                            value = image[imgR][imgC];
                      

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2025 春招笔试合集 文章被收录于专栏

2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

全部评论

相关推荐

10-24 16:49
已编辑
浙江大学 自动化
岗位:AI算法-自动驾驶算法面试地点:杭研所一面&nbsp;50min复盘笔试,问了道选择题,牛顿迭代法求解的公式和意义开始上压力,表示我的简历侧重于机器人控制而不是感知,自驾更难的是感知,问我的项目有哪些用到感知算法的(说实话这是已经觉得要无了,不过叽里咕噜说了一通)之后回到具体项目RL训练机器人运控模型的输入输出模型架构,sim2real的gap,怎么解决学校项目,点云数据的处理过程,原理,最终效果手撕&nbsp;和为k的子数组,力扣原题,前缀和+哈希一面后等了一个多小时没等到二面,等到开饭了hh,二面到下午了二面&nbsp;50min起手依旧是项目拷打,跟一面类似,穿插了很多八股,主要总结下八股吧ros系统的通信方式有哪些:话题&nbsp;服务&nbsp;参数服务器模仿学习数据预处理的dataset和dataloader的区别过拟合和欠拟合,怎么缓解k折交叉验证自注意力机制,QKV含义,为什么除根号dFocal&nbsp;loss怎么优化不平衡样本还有一些很碎的,属于是面试官想到哪点问哪点手撕&nbsp;两个长方形计算iou(交集/并集)三面&nbsp;25min主管面挑一个自己觉得最有挑战性的工作讲一下遇到的困难怎么解决为什么放弃第一代方案,怎么决策的与不同专业同事或者同学之间的协作,意见不合怎么处理怎么看待到大厂做一名螺丝钉,会不会觉得被埋没整体流程大概上午10.00开始,下午3.00面试结束,刚刚看到入池,114525定律还是准的哈哈华子应该是最后一个面试的私企了,接下来要休息一下了,有空了把这几个月的面试经历和体验系统整理一下发出来最后,杭研所虽然挺小的,不过风景真的还算不错(你看这池子它又大又深
投递华为技术有限公司等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务