年終獎
小東所在公司要發年終獎,而小東恰好獲得了最高福利,他要在公司年會上參與一個抽獎遊戲,遊戲在一個6*6的棋盤上進行,上面放着36個價值不等的禮物,每個小的棋盤上面放置着一個禮物,他需要從左上角開始遊戲,每次只能向下或者向右移動一步,到達右下角停止,一路上的格子裏的禮物小東都能拿到,請設計一個算法使小東拿到價值最高的禮物。
給定一個6*6的矩陣board,其中每個元素爲對應格子的禮物價值,左上角爲[0,0],請返回能獲得的最大價值,保證每個禮物價值大於100小於1000。
之前用的回溯,找出每一條路徑,然後寫出最大。後來看了標籤發現這個很典型的DP啊。實力不足。無法一眼看出,還是我被棋盤題影響了。
class Bonus {
public:
int getMost(vector<vector<int> > board) {
// write code here
int dp[7][7]{};
for(int j=0;j<6;++j){
for(int i=0;i<6;++i){
dp[j+1][i+1]=max(dp[j][i+1],dp[j+1][i])+board[j][i];
}
}
return dp[6][6];
}
};
拋小球
小東和三個朋友一起在樓上拋小球,他們站在樓房的不同層,假設小東站的樓層距離地面N米,球從他手裏自由落下,每次落地後反跳回上次下落高度的一半,並以此類推知道全部落到地面不跳,求4個小球一共經過了多少米?(數字都爲整數)
給定四個整數A,B,C,D,請返回所求結果。
測試樣例:
100,90,80,70
返回:1020
這個主要就是要加上下落距離一半後再遞歸。然後注意用小數計算,最後要向上取整,因爲我們在趨近於處進行了取捨。
class Balls {
public:
int calcDistance(int A, int B, int C, int D) {
// write code here
if(!(A||B||C||D)) return 0;
//由於是忽略最後一部分,所以要直接向上取整
return getDis(A,B,C,D)+0.5;
}
private:
double getDis(double A,double B,double C,double D){
if(A<1E-6&&B<1E-6&&C<1E-6&&D<1E-6) return 0;
double sum=A+B+C+D+(A/=2)+(B/=2)+(C/=2)+(D/=2);
return sum+getDis(A,B,C,D);
}
};
小東分蘋果
果園裏有一堆蘋果,一共n頭(n大於1小於9)熊來分,第一頭爲小東,它把蘋果均分n份後,多出了一個,它扔掉了這一個,拿走了自己的一份蘋果,接着第二頭熊重複這一過程,即先均分n份,扔掉一個然後拿走一份,以此類推直到最後一頭熊都是這樣(最後一頭熊扔掉後可以拿走0個,也算是n份均分)。問最初這堆蘋果最少有多少個。
給定一個整數n,表示熊的個數,返回最初的蘋果數。保證有解。
測試樣例:
2
返回:3
注意前後關係,pre/(n-1)*n+1=next。根據next能否在結束前面除盡n-1進行淘汰。
class Apples {
public:
int getInitial(int n) {
// write code here
for(int i=0;;++i){
int j=1,pre,next;
for(pre=i;j<n;++j){
pre=pre/(n-1)*n+1;
if(pre%(n-1)||pre<n-1) break;
}
if(j==n) return pre/(n-1)*n+1;
}
return 0;
}
};