1. 程式人生 > >阿裏巴巴2018屆應屆生模擬考試題

阿裏巴巴2018屆應屆生模擬考試題

猴子 考試題 試題 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屆應屆生模擬考試題