看到上面這個部落格中的一道面試題,如下
有乙個n*n的棋盤,上面有m個糖果,最開始有乙個人在棋盤左上角,他可以向左向右或者向下移動,但不能向上移動,問他最少需要多少步吃完所有糖果。
寫一下自己的思路和**,因為沒有oj可以驗證,不知道對錯,暫且記錄一下。
思路:動態規劃求解
動規計算如果從該位置進入下一行(本行及上面所有行的糖果均已拿到),此時走的最少步數。
我們只要是到一行的進入位置和離開位置,根據糖果的位置拿到這一行糖果的步數就是固定的,所以計算dp[i][j]就是從i-1行的每乙個位置當做入口,找到最小的步數即為dp[i][j]的值。
糖果的位置 只需要記錄每一行最左和最右糖果的位置即可。
注意:向下走的那一步要記得加上。
動態規劃的空間優化,可以使用兩行的陣列。
可能存在一整行都沒有糖果的情況。
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
vector
> input()
return res;
}int min_steps(const
vector
>& data)
//est[0][0]=0;
//est[0][1]=0;
for(int i=0;ifor(int j=0;jif(data[i][j]) continue;
if(j0]) est[i][0]=j;
if(j>est[i][1]) est[i][1]=j;}}
for(int i=0;icout
<0]<<" "
<1]<<"est"
int m[2][2];
m[0][0]=2*est[0][1]-est[0][0];
m[0][1]=est[0][1];
cout
<0][0]<<" "
<0][1]<<"m[0]"
int a=m[0][0],b=m[0][1];
for(int i=1;i1-step;
if(est[i][1]0])
m[step][0] = est[i][1]-est[i][0]+min(m[1-step][0]+abs(est[i][1]-est[i-1][0]),m[1-step][1]+abs(est[i][1]-est[i-1][1]))+1;
m[step][1] = est[i][1]-est[i][0]+min(m[1-step][0]+abs(est[i][0]-est[i-1][0]),m[1-step][1]+abs(est[i][0]-est[i-1][1]))+1;
cout
<0]<<" "
<1]<<" "
<1][0]<<" "
<1][1]<<"estfor"
<0]<<" "
<1]<<"m[step]"
<0];
b=m[step][1];
}return min(a,b);
}int main()
谷歌面試題
這個所謂的面試沒有物理存在,只是邏輯上等同於。題目要求如下 整數序列q中的每個元素都至少能被整數a和b中的乙個整除,現給定a和b,請計算出q中的前n項元素。例如,當a 3,b 5,n 6時,q序列的前6項元素為3,5,6,9,10,12。1 設計函式void generate int a int b...
谷歌面試題
某獵頭收集了140多個google的面試題,都張到他的blog中了,主要是下面這些職位的,因為被牆,且無任何敏感資訊,所以,我原文搬過來了。這篇blog例舉了google用來面試下面這幾個職位的面試題。很多不是很容易回答,不過都比較經典與 是google,microsoft,amazon之類的公司的...
谷歌的面試題
幾星期前,乙個朋友接受了google公司的面試,他透露了面試中的一些問題。順便,我把從其他幾個曾經面試過的人那裡聽來的內容也整理在一起。最大的網際網路公司google的乙份面試題集,看看你是否能夠回答出來。其中很多問題都是開放式的,正確的解答有許多種,所以在這裡就不提供答案了。一輛學校班車裡面能裝多...