阿里巴巴2018届应届生模拟考试题 动态规划

题目

小猴子下山,沿着下山的路由一排桃树,每棵树都结了一些桃子。小猴子想摘桃子,但是有一些条件需要遵守,小猴子只能沿着下山的方向走,不能回头,每棵树最多摘一个,而且一旦摘了一棵树的桃子,就不能再摘比这棵树结的桃子少的树上的桃子了,那么小猴子最多能摘几个桃子呢?举例说明,比如有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);
    }

}

 

      

posted @ 2017-08-21 20:55  夏天的冬天  阅读(857)  评论(0编辑  收藏  举报