猿辅导笔试编程题思路(算法岗位)

代码写的不好别喷啊。。。思路就是这么个思路。。
第一题代码别看了,写的不是很优美,就不贴出来了。。

第一题(100):
根据括号递归,里层括号的输出是外层的输入

第二题(100):
一个记忆化搜索,dp[i][j][k]代表从i,j出发用k次机会最远的距离

if(mat[x][y] < mat[nx][ny]) dp[x][y][kk] = max(dp[x][y][kk], dfs(nx, ny, kk) + 1);
if(mat[x][y] >= mat[nx][ny] && kk > 0) dp[x][y][kk] = max(dp[x][y][kk], dfs(nx, ny, kk - 1) + 1);
在dfs函数最开始的时候判断一下,如果dp[x][y][k]不等于初始值的时候直接返回就可以了
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#define MAXN 505
#define MAXK 11
using namespace std;
int dp[MAXN][MAXN][MAXK];
int mat[MAXN][MAXN];
int n, m, k, ans;
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
int dfs(int x, int y, int kk)
{  if(dp[x][y][kk] != -1) return dp[x][y][kk];  dp[x][y][kk] = 1;  for(int i = 0; i < 4; i++)  {  int nx = x + dx[i];  int ny = y + dy[i];  if(nx < 0 || nx >= n || ny < 0 || ny >= m) continue;  if(mat[x][y] < mat[nx][ny]) dp[x][y][kk] = max(dp[x][y][kk], dfs(nx, ny, kk) + 1);  if(mat[x][y] >= mat[nx][ny] && kk > 0) dp[x][y][kk] = max(dp[x][y][kk], dfs(nx, ny, kk - 1) + 1);  }  return dp[x][y][kk];
}
int main()
{  while(scanf("%d%d%d", &n, &m, &k) != EOF)  {  ans = 0;  for(int i = 0; i < n; i++)  {  for(int j = 0; j < m; j++)  {  scanf("%d", &mat[i][j]);  }  }  memset(dp, -1, sizeof(dp));  for(int i = 0; i < n; i++)  {  for(int j = 0; j < m; j++)  {  dp[i][j][k] = dfs(i, j, k);  ans = max(ans, dp[i][j][k]);  }  }  printf("%d\n", ans);  }  return 0;
}


第三题(70):
dp,二维dp,第二维表示当前i状态下是否在手里,转移方程:
dp[i][1] = dp[i - 1][0];
dp[i][0] = ( ( (dp[i - 1][1] * (LL)(k - 1)) % MOD )+ ( (dp[i - 1][0] * (LL)(k - 2)) % MOD) ) % MOD;
感觉过100,可能需要矩阵快速幂优化一下。。但时间不够了
====================================================
想了一下第三题过100%的解法,
[ai]
[bi]
ai是当前第i回合在我手里的状态,bi是当前回合在其他人手里的状态
则有ai=bi-1  bi=(k-1)*ai-1+(k-2)*bi-1
[ai] = [0       1][ai-1]
[bi] = [k-1 k-2][bi-1]
那么就可以对这个矩阵求一个快速幂模就可以了。。

#猿辅导##笔试题目##题解#
全部评论
大佬可以发代码吗?
点赞 回复 分享
发布于 2019-08-03 21:01
大佬666
点赞 回复 分享
发布于 2019-08-03 20:56
**
点赞 回复 分享
发布于 2019-08-03 20:59
活捉一枚大佬
点赞 回复 分享
发布于 2019-08-03 21:01
大佬
点赞 回复 分享
发布于 2019-08-03 21:12
可以看一下第二题的dp代码吗
点赞 回复 分享
发布于 2019-08-03 21:14
强烈想要第一题的代码,可以发一下吗?🤣🤣🤣😂😂😂
点赞 回复 分享
发布于 2019-08-03 21:23
可以看看题意吗😂 没参加但是想做做看
点赞 回复 分享
发布于 2019-08-03 21:39
大佬你是怎么训练这个思维的啊,我根本就想不到,就不知道怎么下手
点赞 回复 分享
发布于 2019-08-03 21:52
巨佬
点赞 回复 分享
发布于 2019-08-03 22:05
**666
点赞 回复 分享
发布于 2019-08-03 22:36
求第一题代码
点赞 回复 分享
发布于 2019-08-03 23:34
大佬求最后一题代码
点赞 回复 分享
发布于 2019-08-03 23:44
能分享一下最后一题的代码吗?
点赞 回复 分享
发布于 2019-08-04 15:32
想看第三题的代码,求分享,感觉为啥不是按顺序传递呢?做笔试的时候调了好久都没调出来
点赞 回复 分享
发布于 2019-08-06 10:27
(LL) 是什么?
点赞 回复 分享
发布于 2019-08-06 13:28
牛逼,大师球
点赞 回复 分享
发布于 2019-08-08 15:09
大佬我24号笔试,可以分享我你的代码嘛,感激涕零😁😁😁😁😁
点赞 回复 分享
发布于 2019-08-16 16:49
大佬我24号笔试,可以分享我你的代码嘛,感谢
点赞 回复 分享
发布于 2019-08-17 15:24
请问第二题里如果初始化dp全都是-1, if(dp[x][y][kk] != -1) return dp[x][y][kk]; 这个条件如何达成,即dfs搜索到最开始的位置
点赞 回复 分享
发布于 2019-08-21 17:23

相关推荐

死在JAVA的王小美:哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈,我也是,让我免了一轮,但是硬气拒绝了
点赞 评论 收藏
分享
11-26 22:34
已编辑
重庆邮电大学 Java
快手 客户端开发 (n+5)k*16 公积金12
牛客895077908号:佬 什么双非硕啊
点赞 评论 收藏
分享
评论
9
53
分享
牛客网
牛客企业服务