沐哲是乙個菜鳥倉庫的乙個揀貨員,但他有非常個怪異的習慣。每次揀貨的重量都要比之前揀的乙個輕,每次揀到貨後都可以得到1塊錢,沐哲想知道這樣最多能賺多少錢
32 34 7 33 21 2
13 12 3 11 26 36
16 30 22 1 24 14
20 23 25 5 19 29
27 15 9 17 31 4
6 18 8 10 35 28
沐哲可以從倉庫的某個貨架開始揀貨,下一步可以往上走,也可以往下走,當然,向左向右也可以,但必須使得下乙個貨物重量減小,才會去揀。在上面的倉庫中,一條可揀貨的路徑為 25-22-3。當然30-23-20-16-13-12-3可以揀的貨更多。這也是賺錢最多的一條路徑.輸入行數、列數和資料矩陣,輸出所賺的最大錢數。
例子:輸入:
6 632 34 7 33 21 2
13 12 3 11 26 36
16 30 22 1 24 14
20 23 25 5 19 29
27 15 9 17 31 4
6 18 8 10 35 28
輸出:7說明暴力求解在於求貨架上每個元素可以走的最大步數,這裡不需要儲存每一步的座標,只要判斷基於第k步的所有位址下能否存在第k+1步的位址,則意味著可以走到第k+1步,直至不滿足條件為止,此時的k即為最大步數.引數說明:
n.row: 表示原始重量矩陣的行數
n.col: 表示原始重量矩陣的列數
start.i: 表示初始貨物的橫座標
start.j: 表示初始貨物的縱座標
m:表示初始重量矩陣
num_step <- function(n.row, n.col, start.i, start.j, m)else
if(m[i,j]>m[i-1,j])else
# 判斷第k個選擇的垂直向下的貨物是否滿足
if(i==n.row)else
if(m[i,j]>m[i+1,j])else
# 判斷第k個選擇的水平向左的貨物是否滿足
if(j==1)else
if(m[i,j]>m[i,j-1])else
# 判斷第k個選擇的水平向右的貨物是否滿足
if(j==n.col)else
if(m[i,j]>m[i,j+1])else
# 將第k選擇時第s+1步滿足條件的位置儲存下來
next_id <- list(next_up, next_down, next_left, next_right,na)
next_id <- next_id[-which(is.na(next_id))] # 剔除空值
# 將所有k各選擇的s+1步滿足條件的位置儲存下來
index <- c(index, next_id)
}# 判斷s+1步是否有效,即從s到s+1步有沒有路可走
if(length(index)==0)
# 如果有路可走,則將s+1步所有的位置資訊賦給next_step
next_step <- index
s <- s+1
# 用於計數(步長)
}return(s) # 這裡步長即為貨架上以每個貨物為初始值時的最大收益
}
## 計算所有元素為起始點的最大收益
bl_step <- function(n.row, n.col, m)
} return(price)
}## 以題目中給的貨架為例:
m <-matrix(c(32, 34, 7, 33, 21, 2, 13, 12, 3, 11, 26, 36, 16, 30, 22, 1, 24, 14, 20, 23, 25, 5, 19, 29, 27, 15, 9, 17, 31, 4, 6, 18, 8, 10, 35, 28),6,byrow = t)
n.row
<- nrow(m)
print(paste("n.row",n.row, sep = "="))
n.row = 6
n.col
<- ncol(m)
print(paste("n.col",n.col, sep = "="))
n.col = 6
bl_step(n.row, n.col, m)
[,1]
[,2]
[,3]
[,4]
[,5]
[,6]
[1,] 4 5 2 3 2 1
[2,] 3 2 1 2 5 6
[3,] 4 7 2 1 4 1
[4,] 5 6 7 2 3 4
[5,] 6 3 2 3 4 1
[6,] 1 4 1 2 5 2
1.令p為乙個與初始貨架重量矩陣同維度的步數矩陣(初始元素都為0)
2.s=1,即最大步長為1開始
3.矩陣中元素滿足上下左右位置的元素都大於該元素,則該元素的最大步長為1
4.從s=2開始,取矩陣中未賦值的元素(即=0的元素),進行逐個判斷
5.判斷條件1:該元素的上下左右四個元素中至少存在最大步長為(s-1)步的元素
6.判斷條件2:若滿足判斷條件1,則上下左右除去(s-1)元素外,若其餘位置比該元素小的元素都已經賦值,也即它只能被進入而不能超其他方向走;或者其餘位置都比該元素大時,則該元素即為(s+1)步元素
7.重複3-6步,直至矩陣所以元素都已賦值時結束.引數說明:
n.row: 初始矩陣的行數
n.col: 初始矩陣的列數
m:初始貨架重量矩陣
lp_step <- function(n.row, n.col, m)else
if(i==n.row)else
if(j==1)else
if(j==n.col)else
# 將附件的元素的位置儲存下來,並取值,取步數值
round_id <- rbind(up, down, left, right,na)
round_id <- round_id[-which(is.na(round_id), arr.ind = t)[,1],]
round_value <- m[round_id]
round_p <- p[round_id]
id <- which(round_value < m[i,j])# 比該元素小的附近元素的位置
juge_last <- which(round_p==(s-1)) # 取附近最大步數為s-1的元素用於判斷
if(length(juge_last)>0)
}else
if(all(round_p[id]!=0, na.rm = t)) }}
p[temp_step] <- s # 對步數矩陣賦值
## 判斷步數矩陣是否都賦值,是則結束,否則繼續
if(length(which(p==0))==0)
s=s+1
# 計步
}return(p)
}m <-matrix(c(32, 34, 7, 33, 21, 2, 13, 12, 3, 11, 26, 36, 16, 30, 22, 1, 24, 14, 20, 23, 25, 5, 19, 29, 27, 15, 9, 17, 31, 4, 6, 18, 8, 10, 35, 28),6,byrow = t)
n.row <- nrow(m)
n.col <- ncol(m)
lp_step(n.row, n.col, m)
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 452
321[2,] 321
256[3,] 472
141[4,] 567
234[5,] 632
341[6,] 141
252
阿里演算法內推筆試題
include include include include include include include include define pi 3.1415926 define num 10000 using namespace std 請完成下面這個函式,實現題目要求的功能 當然,你也可以不按...
阿里巴巴內推題目之一
前段時間去面阿里巴巴,雖然最後以失敗告終 其實自己也不知道自己在面試的時候範了什麼錯誤 但是發現阿里巴巴面試官提出的幾個問題還是挺有 收藏價值 的所以寫了這篇部落格 題目 對於乙個從小到大的陣列,並且給定另外乙個資料data,要求從陣列中找到兩個資料,要求兩個資料之和為data,要求在o n 時間複...
面試筆試題分析之一
function sendpost callback const manager this.counter sendpost onsuccess manager.increase 輸出 undefined。原因 函式shendpost是在外面定義的window上的函式,所以內部this指向windo...