首页 > 编程语言 >算法Day1—动态规划(剑指offer42+47)

算法Day1—动态规划(剑指offer42+47)

时间:2024-03-22 20:59:59浏览次数:30  
标签:arr offer42 int 47 Day1 length grid 数组 dp

动态规划解题思路

  1. 确定状态(两个核心,最后一步,化成子问题)

    根据最后一步,往前推。然后将问题转化成从开始到最后一步的子问题。

  2. 状态转移方程 结果=开始到最后一步+最后一步。

  3. 开始和边界条件 确定0,以及边界不适合转移方程的条件。

  4. 计算顺序 一般都是推导到从最开始计算。

剑指offer47:礼物的最大价值

题目:在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?

状态转移方程:dp(i,j)=max(dp(i-1,j),dp(i,j-1))+grid(i,j)

边界:dp(0,0)=grid(0,0);

dp(0,j)=dp(0,j-1)+grid(0,j); dp(i,0)=dp(i-1,0)+grid(i,0)

class Solution{
	public int maxValue(int[][] grid){
		int m=grid.length, n=grid.length[0];
		for(int j=1; j<n; j++) grid[0][j]+=grid[0][j-1];  //for用;不是,
		for(int i=1; i<m; i++) grid[i][0]+=grid[i-1][0];
		for(int i=1; i<m; i++){
			for(int j=1; j<n; j++){
				grid[i][j]+=Math.max(grid[i-1][j],grid[i][j-1]);
			}
		}
		return grid[m-1][n-1];
	}
}

剑指offer42:连续子数组的最大和

题目:输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。

状态方程:dp[i]=max(dp[i-1]+nums[i], nums[i])

边界:dp[0]=0

class Solution{
	public int maxSetArray(int[] nums){
		int res=nums[0], n=nums.length;
		for(int i=1; i<n; i++){
			nums[i] += Math.max(nums[i-1], 0);
			res = Math.max(res, nums[1]);
		}
		return res;
	}
}

JAVA常识

之前一直用python,小细节得慢慢改qaq

1.数组

声明数组:数据类型[] 数组名称(二维[][])

int[][] grid

 初始化:数据类型 [] 数组名称 = new 数据类型 [长度]

//动态初始化
int[] cat = new int[5];
arr[0] = 0;
arr[1] = 1;
arr[2] = 3;
arr[3] = 4;
arr[4] = 5;
//静态初始化
int[] arr2 = new int []{1,2,3,4,5};
 2. 数组长度length

一维数组,a.length 方法,返回这个数组的长度。

二维数组中,b.length方法,返回b数组的行数;b[0].length方法,返回0行所代表的长度。

3. 函数定义

修饰符 返回值类型 函数名称(参数类型 参数1,参数类型参数2, . . . ){
        函数执行代码;
        return 返回值;
}

4. for循环

for (循环变量赋初值; 循环条件; 循环变量增值) //分号!不是逗号 {

        语句;

}

标签:arr,offer42,int,47,Day1,length,grid,数组,dp
From: https://blog.csdn.net/m0_47391737/article/details/136912333

相关文章

  • 算法打卡day25|回溯法篇05|Leetcode 491.递增子序列、46.全排列、47.全排列 II
     算法题Leetcode491.递增子序列题目链接:491.递增子序列大佬视频讲解:递增子序列视频讲解 个人思路和昨天的子集2有点像,但昨天的题是通过排序,再加一个标记数组来达到去重的目的。而本题求自增子序列,是不能对原数组进行排序的,因为排完序的数组都是自增子序列了。解决......
  • 【嵌入式开发】447
    【嵌入式开发】当我们谈论嵌入式系统中的通讯方式时,串行通讯与并行通讯是两种最为基础和常见的通信模式。它们在数据传输、设备间交互以及系统控制等方面都发挥着至关重要的作用。接下来,我将结合我的嵌入式开发经验,对这两种通讯方式进行深入的剖析。并行通讯并行通讯是一......
  • (47/60)打家劫舍、打家劫舍Ⅱ、打家劫舍Ⅲ
    day47打家劫舍leetcode:198.打家劫舍动态规划代码实现/*偷到下标为i的最大金额数为dp[i]偷i、不偷i:dp[i]=max(dp[i-2]+nums[i],dp[i-1]);dp[0]=nums[0];dp[1]=max(nums[0],nums[1]);正序遍历*/classSolution{public:introb(vector<int>&nums){......
  • lc1547 切割棍子的最小成本
    有一根长度为n的木棍,从0到n标记了若干个位置。给定一个数组cuts[m],表示要在cuts[i]位置切开,每次切割的成本是当前木棍的长度,求总成本的最小值。2<=n<=1e6;1<=m<=min(n-1,100);1<=cuts[i]<=n-1;cuts[i]各不相同正向思考的话可以记忆化dfs,也可以逆向思考,转成合并问题,用区间dp求......
  • 代码随想录算法训练营day29 | leetcode 491. 非递减子序列、46. 全排列、47. 全排列 I
    目录题目链接:491.非递减子序列-中等题目链接:46.全排列-中等题目链接:47.全排列II-中等题目链接:491.非递减子序列-中等题目描述:给你一个整数数组nums,找出并返回所有该数组中不同的递增子序列,递增子序列中至少有两个元素。你可以按任意顺序返回答案。数组中可能含有重......
  • P1347 排序
    原题链接题解1.\(A<B\)\(\to\)建立一条A向B的边2.由于数据范围小,所以可以输入一次进行一次拓扑遍历3.如果存在矛盾,说明存在环4.对于拓扑排序进行层次标记,如果最大层等于n,代表每个字母层次分明,有先后次序code#include<bits/stdc++.h>usingnamespacestd;vector<int>G[......
  • 代码随想录算法训练营第十三天|239. 滑动窗口最大值、347.前 K 个高频元素、总结
    题目:239.滑动窗口最大值文章链接:代码随想录视频链接:LeetCode:239.滑动窗口最大值题目链接:力扣题目链接图释:classSolution{public://自己定义一个优先队列classMyQueue{public: deque<int>deq; //弹出 voidpop(intvalue){ //当输入的数组与队顶......
  • 代码随想录算法训练营第十一天| 20. 有效的括号、1047. 删除字符串中的所有相邻重复项
    题目:20.有效的括号文章链接:代码随想录视频链接:LeetCode:20.有效的括号题目链接:力扣题目链接图释:classSolution{public://有效的括号boolisValid(strings){ //遇到左括号时就放入右括号,遇到右括号时,与栈内的顶元素进行比较 //情况一:与栈顶元素相等,则是t......
  • 【Linux Day16 I/O复用】
    I/O复用用途:I/O复用能同时监听多个文件描述符。I/O复用虽然能同时监听多个文件描述符,但它本身是阻塞的。并且当多个文件描述符同时就绪时,如果不采取额外的措施,程序就只能按顺序依处理其中的每一个文件描述符,这使得服务器看起来好像是串行工作的。如果要提高并发处理......
  • 算法训练营day1
    1.二分查找给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1https://leetcode.cn/problems/binary-search/description/classSolution{public:intsearch(vector<int>&......