嵌入式面试题 C C++ 动态规划面试题总结

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

https://violentayang.blog.csdn.net/article/details/123061036

1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 #define N 9
 5 
 6 int main() 
 7 {
 8     int a[N] = {1,8,6,2,5,4,8,3,7};
 9     int i = 0,j = N-1,sun = 0,top = 0;
10     while(i<j)
11     {
12         if(a[i]<a[j])
13         {
14             sun = (j-i)*a[i]; 
15             if(sun>top)
16             {
17                 top = sun;
18             }
19             i++;
20         }
21         else
22         {
23             sun = (j-i)*a[j]; 
24             if(sun>top)
25             {
26                 top = sun;
27             }
28             j--;
29         }
30     }
31     printf("可以盛%d吨的水\n",top);
32     
33     return 0;
34 }

c++实现:

1 #include<iostream>
 2 #include<vector>
 3 using namespace std;
 4 
 5 class node{
 6 public:
 7     int maxsrea(vector<int>& height){
 8         int ans = 0;
 9         int l = 0,r = height.size()-1;
10         while(l<r){
11             ans = max(ans,min(height[l],height[r]) * (r-l));
12             if(height[l] < height[r]) l++;
13             else r--;
14         }
15         return ans;
16     }
17 };
18 
19 int main()
20 {
21     node n;
22     vector<int> height = {1,8,6,2,5,4,8,3,7};
23     cout << n.maxsrea(height) << endl;
24     
25     return 0;
26 }

3.不同路径

一个机器人位于一个 m x n 网格的左上角 。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。

问总共有多少条不同的路径?

https://blog.csdn.net/C_chengxuyuan/article/details/119980859

1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 int main() 
 5 {
 6    int x,y;
 7    int a[100][100];
 8    printf("输入网格的长和宽\n");
 9    scanf("%d%d",&x,&y);
10    
11    for(int i = 0;i<x;i++)
12    {
13        a[i][0] = 1;
14    }
15    
16    for(int j = 0;j<y;j++)
17    {
18        a[0][j] = 1;
19    }
20    
21    for(int i = 1;i<x;i++)
22    {
23        for(int j  = 1;j<y;j++)
24        {
25            a[i][j] = a[i-1][j] + a[i][j-1];
26        }
27    }
28    
29    printf("长和宽为%d,%d的网格,总共有%d条不同的路径\n",x,y,a[x-1][y-1]);
30     
31     return 0;
32 }

c++实现:

1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 
 5 class node{
 6 public:
 7    int uniquePath(int m,int n){
 8       vector<vector<int>> f(m,vector<int>(n,1));
 9       for(int i = 1;i<m;i++){
10          for(int j = 1;j<n;j++){
11             f[i][j] = f[i-1][j] + f[i][j-1];
12          }
13       }
14       return f[m-1][n-1];
15    }
16 };
17 
18 int main()
19 {
20    int y = 3,x = 7;
21    node n;
22    cout << "长为7,宽为3的网格从左上角到右下角的路径有:" << n.uniquePath(x,y);
23    
24    return 0;
25 }

不同路径中间有障碍物(力扣第63题)

1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 
 5 class node{
 6 public:
 7    int unique(vector<vector<int>>& o){
 8       int m = o.size(),n = o[0].size();
 9       vector<vector<int>> f(m,vector<int>(n));
10          for(int i = 0;i<m;i++){
11             for(int j = 0;j<n;j++){
12                if(o[i][j] == 1) continue;
13                if(!i&&!j) f[i][j] = 1;
14                else{
15                   if(i) f[i][j] += f[i-1][j];
16                   if(j) f[i][j] += f[i][j-1];
17                }
18             }
19          }
20          return f[m-1][n-1];
21       }
22 };
23 
24 int main()
25 {
26    node n;
27    vector<vector<int>> cur;
28    cur.push_back({0,0,0});
29    cur.push_back({0,1,0});
30    cur.push_back({0,0,0});
31    cout << n.unique(cur) << endl;
32     
33    return 0;
34 }

4.最小路径和

一个机器人位于一个 m x n 网格的左上角 ,m x n的网格中分布着不同的数字

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角,找出路径的最小和。

1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 #define N 3
 5 #define M 3
 6 
 7 int main() 
 8 {
 9    int a[N][M] = {{1,3,1},{1,5,1},{4,2,1}};
10    int b[100][100];
11    
12    b[0][0] = a[0][0];
13    
14    for(int i = 1;i<N;i++)
15    {
16        b[i][0] = b[i-1][0] + a[i][0];
17    }
18    
19    for(int j = 1;j<M;j++)
20    {
21        b[0][j] = b[0][j-1] + a[0][j];
22    }
23    
24   for(int i = 1;i<N;i++)
25   {
26       for(int j  = 1;j<N;j++)
27       {
28           b[i][j] = (b[i-1][j] > b[i][j-1] ? b[i][j-1]:b[i-1][j])+a[i][j];
29       }
30   }
31    
32    printf("长和宽为%d,%d的网格,最小路径和为%d\n",N,M,b[N-1][M-1]);
33     
34     return 0;
35 }

5.最长上升子序列

一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1,a2,…,aN),我们可以得到一些上升的子序列(ai1,ai2,…,aiK),

这里1≤i1 < i2 < … < iK≤N。比如,对于序列(1,7,3,5,9,4,8),有它的一些上升子序列,如(1,7),(3,4,8)等等。这些子序列中最长的长度是4,比如子序列(1,3,5,8)。

你的任务,就是对于给定的序列,求出最长上升子序列的长度。

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

[外链图片转存中…(img-oe5CqSB0-1715716298569)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值