IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Lintcode 动态规划练习 -> 正文阅读

[数据结构与算法]Lintcode 动态规划练习

109 · 数字三角形

public class Solution {
    public int minimumTotal(int[][] triangle) {
        int n = triangle.length;
        if (n == 0) return -1;
        
        for (int i = n - 2; i >= 0; i --) {
            for (int j = 0; j <= i; j ++) {
                triangle[i][j] += Math.min(triangle[i + 1][j], triangle[i + 1][j + 1]);
            }
        }
        return triangle[0][0];
    }
}

114 · 不同的路径

public class Solution {
    public int uniquePaths(int m, int n) {
        int f[][] = new int[m + 1][n + 1];
        f[0][1] = 1;

        for (int i = 1; i <= m; i ++) {
            for (int j = 1; j <= n; j ++) {
                f[i][j] = f[i - 1][j] + f[i][j - 1];
            }
        }
        return f[m][n];
    }
}

115 · 不同的路径 II

public class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int n = obstacleGrid.length;
        int m = obstacleGrid[0].length;

        for (int i = 0; i < n; i ++) {
            for (int j = 0; j < m; j ++) {
                if (obstacleGrid[i][j] == 1) obstacleGrid[i][j] = 0;
                else if (i == 0 && j == 0) obstacleGrid[i][j] = 1;
                else if (i == 0) obstacleGrid[i][j] = obstacleGrid[i][j - 1];
                else if (j == 0) obstacleGrid[i][j] = obstacleGrid[i - 1][j];
                else obstacleGrid[i][j] = obstacleGrid[i - 1][j] + obstacleGrid[i][j - 1];
            }
        }

        return obstacleGrid[n - 1][m - 1];
    }
}

679 · 不同的路径 III

public class Solution {
    public int uniqueWeightedPaths(int[][] grid) {
        int n = grid.length;
        int m = grid[0].length;
        if (n == 0 || m == 0) return 0;        

        Set[][] f = new HashSet[n][m];

        for (int i = 0; i < n; i ++) {
            for (int j = 0; j < m; j ++) {
                f[i][j] = new HashSet();
                if (i == 0 && j == 0) {
                    f[i][j].add(grid[i][j]);
                }
                else {
                    if (i != 0) {
                        for (Object num : f[i - 1][j]) {
                            f[i][j].add((int)num + grid[i][j]);
                        }
                    }
                    if (j != 0) {
                        for (Object num : f[i][j - 1]) {
                            f[i][j].add((int)num + grid[i][j]);
                        }
                    }
                }
            }
        }

        int ans = 0;
        for (Object num : f[n - 1][m - 1]) ans += (int)num;

        return ans;
    }
}

630 · 骑士的最短路径II

public class Solution {
     public int shortestPath2(boolean[][] grid) {
		int n = grid.length;
		int m = grid[0].length;
		if (n == 0 || m == 0) return -1;

		int f[][] = new int[n][m];
		int[] dx = {-2, -1, 1, 2};
		int[] dy = {-1, -2, -2, -1};	
		
	   	for (int j = 0; j < m; j ++) {		//从左到右
			for (int i = 0; i < n; i ++) {
				if (grid[i][j]) continue;	//有障碍物
				if (i == 0 && j == 0) {		//起点
					f[i][j] = 1;
					continue;
				}
			   	for (int k = 0; k < 4; k ++) {
					int x = i + dx[k];
					int y = j + dy[k];					
					
				   	if (x < 0 || y < 0 || x >= n || f[x][y] == 0) continue;
				   	if (f[i][j] == 0) f[i][j] = f[x][y] + 1;
					else f[i][j] = Math.min(f[i][j], f[x][y] + 1);
			   	}
		   	}
	   	}

	   	return f[n - 1][m - 1] - 1;
    }
}

116 · 跳跃游戏

  • 动规
public class Solution {
    public boolean canJump(int[] A) {
        int n = A.length;
        if (n == 0) return true;

        boolean f[] = new boolean[n];
        f[0] = true;
        for (int i = 0; i < n; i ++) {
            if (f[i] == false) continue;
            for (int j = 1; j <= A[i]; j ++) {
                if (i + j < n) {
                    f[i + j] = true;
                }
            }
        }
        return f[n - 1];
    }
}
  • 贪心
public class Solution {
    public boolean canJump(int[] A) {
        int n = A.length;
        if (n == 0) return true;

        int maxx = 0;          //能够到达的最远处
        for (int i = 0; i < n; i ++) {
            if (i <= maxx && i + A[i] > maxx) {
                maxx = i + A[i];
            }
        }
        return maxx >= n - 1;
    }
}

92 · 背包问题

  • 二维数组
public class Solution {
    public int backPack(int m, int[] A) {
        int n = A.length;

        int f[][] = new int[n + 1][m + 1];  //前i件物品放入容量为j的背包,最多能装f[i][j]
        for (int i = 1; i <= n; i ++) {
            int t = A[i - 1];				//第i件物品的重量是A[i - 1]
            for (int j = 0; j <= m; j ++) {         
                if (t > j) f[i][j] = f[i - 1][j];
                else f[i][j] = Math.max(f[i - 1][j], f[i - 1][j - t] + t);
            }
        }

        return f[n][m];
    }
}
  • 一维数组
public class Solution {
    public int backPack(int m, int[] A) {
        int f[] = new int[m + 1];		//前i件物品放入容量为j的背包,最多能装f[j]
        for (int i = 1; i <= A.length; i ++) {
            int t = A[i - 1];			//第i件物品的重量是A[i - 1]
            for (int j = m; j >= t; j --) {      		
                f[j] = Math.max(f[j], f[j - t] + t);
            }
        }

        return f[m];
    }
}
  • 一维 + 或运算
public class Solution {
    public int backPack(int m, int[] A) {
        int f[] = new int[m + 1];       //如果前i件物品可以装出j的容量,则f[j] = 1
        
        f[0] = 1;
        for (int i = 1; i <= A.length; i ++) {
            int t = A[i - 1];           //第i件物品的重量是A[i - 1]
            for (int j = m; j >= t; j --) {  
                f[j] |= f[j - t];
            }
        }

        int ans = 0;
        for (int i = m; i >= 0; i --) {
            if (f[i] == 1) {
                ans = i;
                break;
            }
        }
        return ans;
    }
}

724 · 最小划分

public class Solution {
    public int findMin(int[] nums) {
        int sum = 0;
        for (int i = 0; i < nums.length; i ++) sum += nums[i];

        int f[] = new int[sum + 1];
        for (int i = 1; i <= nums.length; i ++) {
            int t = 2 * nums[i - 1];
            for (int j = sum; j >= t; j --) {
                f[j] = Math.max(f[j], f[j - t] + t);
            }
        }
        return sum - f[sum];
    }
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-11 22:26:29  更:2022-03-11 22:30:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 13:49:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码