阿里巴巴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); } }