解题思路:  理解题目意思后,写出推导式dp[j]=max(arr[j]+dp[j-2],dp[j-1])即可得出答案,这个过程需要多刷题才能有更深一步的体会。

动态规划我现在做了几题,还处于入门阶段,但是目前接触下来,我发现最重要的是能够写出推导式,思路一定要特别明确,还有构造出自己到底需要什么样的dp数组,我们不是要去关注dp的下标,而是想要解的数组的下标。dp数组就是一个备忘录。动态规划就是空间换时间的非常好的方法。

实际上这题肯定有比我更好的思路和解法,但是我认为我写的这个比较符合我自己的逻辑
注意事项:

参考代码:

import java.util.Arrays;
import java.util.Scanner;

public class Main {

//完成初始化
   static int T, N;
   static Scanner sc = new Scanner(System.in);
   static int[] arr;
   static int[] dp;

   public static void price() {
       N = sc.nextInt();
       arr = new int[N];
       for (int i = 0; i < N; i++) {
           arr[i] = sc.nextInt();
       }
       System.out.println(sum());
   }

   public static int sum() {
       dp = new int[N];
       dp[0] = arr[0];     //第一家的钱赋给dp[0][0]
       if (N > 1) {          //当商店大于1时
           dp[1] = Math.max(arr[0], arr[1]);   //第一家的钱和第二家比较
           for (int i = 2; i < N; i++) {            

//2进来的时候,当大于等于三家的时候,进行比较      

//拿最简单的3个就是偷1和3  还有偷2  就是i=2开始比较

//第二家和(第一家加上第三家)比较     i++  i=3时   第三家和第二家加上第四家比较,一直在循环取最大值

//这里开始比较:前一家不偷,那就是偷了前一家的前一家加上这一家。

               dp[i] = Math.max(dp[i - 1], dp[i - 2] + arr[i]);     
           }
       }
       return dp[N - 1];
   }

   public static void main(String[] args) {
       T = sc.nextInt();
       for (int i = 0; i < T; i++) {
           price();
           Arrays.fill(dp, 0);  //对dp数组初始化,这一步是必要的否则后续会出错
       }
   }
}


点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论