阿裏巴巴2018屆應屆生模擬考試題
阿新 • • 發佈:2017-08-21
猴子 考試題 試題 stat println 位置 scan args 最大的
題目
小猴子下山,沿著下山的路由一排桃樹,每棵樹都結了一些套子。小猴子想摘桃子,但是有一些條件需要遵守,小猴子只能沿著下山的方向走,不能回頭,每棵樹最多摘一個,而且一旦摘了一棵樹的桃子,就不能再摘比這棵樹結的桃子少的樹上的桃子了,那麽小猴子最多能摘幾個桃子呢?舉例說明,比如有5課樹,分別結了10,4,5,12,8顆桃子,那麽小猴子最多能摘3顆桃子,來自於結了4,5,8顆桃子的樹。
這道題可以用dp來解。
dp[i]表示以第i號位置的樹為最後一顆樹,這種情況下所能取得的最大的桃子。
1.那麽dp[i]一定大於等於1,因為若前面都不選,那這顆樹一定能取得桃子。
2.對於第dp[j] (j<i) 需要考慮的是,這個j位置上的樹能不能取桃子,以及取了桃子的話,能不能大於dp[i],若能則更新dp[i]。
即:if(dp[j]+1>dp[i]) dp[i]=dp[j]+1;
那麽。就可以有下面的代碼了:
import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner scn = new Scanner(System.in); int trees = scn.nextInt(); int[] peaches = new int[trees]; for (int i = 0; i < trees; i++) { peaches[i]= scn.nextInt(); } int[] dp = new int[trees]; for (int i = 0; i < trees; i++) { dp[i] = 1; for (int j = 0; j < i; j++) { /** * 表示,第j個位置上的樹可以拿,並且拿了桃子的話,總大小能夠超過第i個位置 */ if (peaches[j] <= peaches[i] && dp[j] + 1 > dp[i]) { dp[i]= dp[j] + 1; } } } int max = 1; for (int i : dp) max = max > i ? max : i; System.out.println(max); } }
阿裏巴巴2018屆應屆生模擬考試題