算法-动态规划
Nuan_Feng
蓝桥杯国赛一等奖。唯有志存千里,方能风行天下。
展开
-
使用动态规划弹性扩容机器。使用拉链法O(N)求所有集合
最近有一个需求,当有大量空闲vm时,就需要回收机器,而每台机器最大vm数量不等,可以采用采用动态规划/贪心处理,这里主要用动态规划。5年没碰动态规划了,于是花了1小时看了一下以前写的算法。package com.tenclass.nvwa.bard.core.domain.content.service/** * auth: wangchao * date: 2021年3月31日21:22:02 */fun main() { val arr: MutableList<Dyna原创 2021-03-31 22:24:37 · 220 阅读 · 0 评论 -
数塔-诡异的电梯
package 动态规划.数塔;import java.util.Scanner;/* * 如果有学生在相邻的两层之间要停下, 则其中的一部分学生必须选择走楼梯来代替。 * dp[n]表示从1层到n层花费的最小体力 * 情况1:n和n-2层停, * dp[n]=dp[n-2]+n-1层的总人数*(上楼的花费||下楼的花费) * 情况2:n和n-3停原创 2017-02-23 13:10:05 · 223 阅读 · 0 评论 -
数塔-免费馅饼
package 动态规划.数塔;import java.util.Scanner;/* * 如果使用第一秒的获取第二秒最多的,当到第二秒时,又是以第二秒为状态去获取下一秒的最多的,第一秒获得的无法获得。 * 建模。 * 他是从下往上的获取馅饼个数,直至获得最多, * 如果从下面往上获得的话取最大值相加的话,无法存储之前的状态 * 从下面往下面获得的话,最终会靠近原创 2017-02-23 13:10:20 · 286 阅读 · 0 评论 -
树状-金属采集
package 动态规划.树状;import java.io.IOException;import java.io.InputStream;import java.util.Arrays;/* * 问题描述人类在火星上发现了一种新的金属!这些金属分布在一些奇怪的地方,不妨叫它节点好了。一些节点之间有道路相连,所有的节点和道路形成了一棵树。一共有 n 个节原创 2017-02-23 13:11:00 · 431 阅读 · 0 评论 -
石子-石子合并
package 动态规划.石子问题;import java.util.Scanner;/*因为可以从任意点开始合并,所以无法像一样,每次往后移动一位,直到结束。 * 可以和左右2边合并 * 阶段:2-N,每次合并长度, * 状态:以长度为基准,有多少个状态(可以合并多少次),譬如长度为2,状态即为n-1 * 决策:长度为2时,即1个决策,为3时2个决策原创 2017-02-23 13:11:30 · 361 阅读 · 0 评论 -
石子-能量项链
package 动态规划.石子问题;import java.util.Scanner;/* * 涉及到环,开辟2n空间模拟环即可 *假设第一个珠子和第二个珠子合并 *第一个珠子的值为1,2 *第二个珠子的值为2,3 *合并的花费为1*2*3 *但是这里只用了1维数组来模拟,而k是从start开始的,所以值为arr[start]+arr[k+1]+ar原创 2017-02-23 13:11:46 · 239 阅读 · 0 评论 -
区间-摆花
package 动态规划.区间;import java.util.Scanner;public class 摆花 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int m = sc.nextInt();int ar原创 2017-02-23 13:12:16 · 320 阅读 · 0 评论 -
区间-还是回文
package 动态规划.区间;import java.util.Scanner;/* * 长度为N的字符串,变成回文数的花费 * 如果是要一维数组的话dp[]不行 * 因为有可能删除中间的字符,有可能删除最后一个字符,删除的字符所在的区间不确定所以采用二维数组 * dp[i][j]:表示i~j范围内的花费,最后的花费必然是dp[1][n] * 1:首先只保留对原创 2017-02-23 13:12:31 · 277 阅读 · 0 评论 -
区间-数的划分
package 动态规划.区间;import java.util.Scanner;public class 数的划分 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int num = sc.nextInt();int dp[][] = new原创 2017-02-23 13:12:47 · 631 阅读 · 0 评论 -
背包问题-多重背包问题-金明的预算方案
package 动态规划.多重背包问题;import java.util.Scanner;/* * 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”。今天一早,金明就开始做预算了,他把想买的物品分为两类:主件与附件,附件是从属原创 2017-02-23 13:13:13 · 424 阅读 · 0 评论 -
背包问题-背包01-zb的生日
package 动态规划.背包01;import java.util.Scanner;/* * 让两堆的重量之差最小 * 问题转换,一半重量所能达到的最大组合为多少?转换为01背包问题,求出最大组合后,sum-half-half即为答案 */public class zb的生日 {public static void main(String[] args) {Sca原创 2017-02-23 13:13:46 · 405 阅读 · 0 评论 -
背包问题-背包01-大数据
package 动态规划.背包01;import java.util.Arrays;import java.util.Scanner;/* * 重量w,放满N个物品保证价值最大, * 当w过小时可以使用dp[w]=max(dp[w],dp[w-j]+vi);j表示重量,vi表示当前价格 * 当w过大时,不适用 * 可以使用问题转换,价值p,保证放满重量最少的物品原创 2017-02-23 13:14:09 · 982 阅读 · 0 评论 -
背包问题-背包01-小数据
package 动态规划.背包01;import java.util.Scanner;public class 背包01_小数据 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int m = sc.nextIn原创 2017-02-23 13:14:31 · 285 阅读 · 0 评论 -
背包问题-背包01-苹果
package 动态规划.背包01;import java.util.Scanner;public class 苹果 {static class Apple {public int c;public int w;public Apple(int c, int w) {this.c = c;this.w = w;}}publ原创 2017-02-23 13:14:53 · 272 阅读 · 0 评论 -
背包问题-背包01-硬币找零
package 动态规划.背包01;import java.util.Arrays;import java.util.Scanner;public class 硬币找零 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n;int m;wh原创 2017-02-23 13:15:25 · 335 阅读 · 0 评论 -
吝啬的国度_链式前向星
package 搜索;import java.util.Arrays;import java.util.LinkedList;import java.util.Queue;import java.util.Scanner;/* * 深搜, * 广搜, * 新算法 * 数据结构:链式前向星|链表|数组 * 获取上一个城市编号即可 */publi原创 2017-02-23 13:17:31 · 254 阅读 · 0 评论 -
吝啬的国度_链表_数组存储
package 搜索;import java.util.LinkedList;import java.util.Queue;import java.util.Scanner;public class 吝啬的国度_链表_数组存储 {static class Edge {public int next;public Edge e;}stati原创 2017-02-23 13:17:43 · 183 阅读 · 0 评论 -
数塔-聪明的KK
package 动态规划.数塔;import java.util.Scanner;/* * 数塔:从某一点转向另一点或者说是从某一状态转向另一状态,有多种选择方式(比如这里的9->12 , 9->15),从中选取一条能产生最优值的路径。 * 从(1,1)出发(n,m)点吃最多的虫子,可以向右边以及下边走, * 第二层依赖上层和左边 * (n,m)依赖(n-1,m)|原创 2017-02-23 13:09:43 · 273 阅读 · 0 评论 -
背包问题-完全背包-贪吃的大嘴
package 动态规划.完全背包;import java.util.Arrays;import java.util.Scanner;public class 贪吃的大嘴 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();原创 2017-02-23 13:09:11 · 551 阅读 · 0 评论 -
背包问题-完全背包-背包问题
package 动态规划.完全背包;import java.util.Scanner;/* * 针对有小数,不便使用 */public class 背包问题 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();w原创 2017-02-23 13:08:49 · 379 阅读 · 0 评论 -
最小距离
package 动态规划;import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;import java.text.DecimalFormat;import java.util.ArrayList;/** * 4点构成一个矩形, 坐标的取值范围是原创 2017-02-23 12:58:04 · 339 阅读 · 0 评论 -
擅长排列的小明II
package 动态规划;import java.util.Scanner;/* * 第一个数为1 * 2数之差 * 第一个数为1 * 那么第二个数就可以为 * 2,后面可以任意(n-1) * 3后面能4/5/2 * 当为4时,下一个数为2,下一个数为5,不满足条件, * 当为5时,下一个可以为4,下一个可以为2,特殊的组合13542 * 当为2原创 2017-02-23 13:01:06 · 245 阅读 · 0 评论 -
魔法少女
package 动态规划;import java.util.Scanner;public class 魔法少女 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {int m = sc.nextInt();int ar原创 2017-02-23 13:01:30 · 293 阅读 · 0 评论 -
格子刷油漆
package 动态规划;import java.util.Scanner;public class 格子刷油漆 {static final int MOD = 1000000007;public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n =原创 2017-02-23 13:02:16 · 232 阅读 · 0 评论 -
概率计算
package 动态规划;import java.util.Scanner;/* * 问题描述 生成n个∈[a,b]的随机整数,输出它们的和为x的概率。 输入格式 一行输入四个整数依次为n,a,b,x,用空格分隔。 输出格式 输出一行包含一个小数位和为x的概率,小数点后保留四位小数 样例输入 2 1 3 4 样例输出 0.3333 数据规原创 2017-02-23 13:03:28 · 390 阅读 · 0 评论 -
地宫寻宝
package 动态规划;import java.io.BufferedInputStream;import java.io.IOException;import javax.management.MXBean;public class 地宫寻宝 {private static final long MOD = 1000000007;static B原创 2017-02-23 13:03:47 · 331 阅读 · 0 评论 -
超级台阶
package 动态规划;import java.util.Scanner;public class 超级台阶 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();while (n-- > 0) {int m = sc.原创 2017-02-23 13:04:02 · 247 阅读 · 0 评论 -
超级玛丽
package 动态规划;import java.util.Scanner;/* * 陷阱不会位于1及n上 * 没有陷阱时: * dp[n]=dp[n-1]+dp[n-2]; * 有陷阱的时: * 点1是陷阱的话,只会影响1后面的, * 如果点1是陷阱的话,点2为dp[2]=dp[2-2]加上之前那个点即可 * 也就是陷阱那个点不参与运算 */p原创 2017-02-23 13:04:17 · 1053 阅读 · 0 评论 -
Zero_One串
package 动态规划;import java.util.Scanner;/* * 0->(0,1) * 1->(0) * dp[n]=dp[n-1]以0结尾*2+dp[n-1]以1结尾 *提取共性,以1结尾的下一个数只能是0,以0结尾的能0,1, *dp[n]以0结尾的为dp[n-1] *接下来解决dp[n]以1结尾,以1结尾的,前一个必定为0,原创 2017-02-23 13:04:37 · 260 阅读 · 0 评论 -
最长升序和降序子序列-作业题
package 动态规划.最长升序和降序子序列;import java.util.Arrays;import java.util.Comparator;import java.util.Scanner;public class 作业题 {static class Position {public int x;public int y;public P原创 2017-02-23 13:05:12 · 1045 阅读 · 0 评论 -
最长升序和降序子序列-分分钟的碎碎念
package 动态规划.最长升序和降序子序列;import java.util.Scanner;public class 分分钟的碎碎念 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int arr[] =原创 2017-02-23 13:05:38 · 511 阅读 · 0 评论 -
最长升序和降序子序列-导弹拦截2_优化
package 动态规划.最长升序和降序子序列;import java.util.Scanner;/*升序 * 时间复杂度O(log) * 从arr里面每次拿出一个数,跟t数组最后以为进行比较, * 大:放t数组后面 * 小:覆盖从t数组往前找最后一个比自己小的,覆盖他前面一个,(利用2分查找) * t[1] */public class 导弹拦截2_优原创 2017-02-23 13:06:01 · 431 阅读 · 0 评论 -
最长升序和降序子序列-导弹拦截2
package 动态规划.最长升序和降序子序列;import java.util.Scanner;/*升序 * 它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度。要准备几套这样的导弹拦截系统 * 能有多少个最长降序子序列==>最长升序子序列长度 * 因为降序只能覆盖降序的,升序的绝对覆盖不了,实际上求得就是升序的个数 */pub原创 2017-02-23 13:06:20 · 478 阅读 · 0 评论 -
最长升序和降序子序列-聪明的美食家_拦截导弹
package 动态规划.最长升序和降序子序列;import java.util.Scanner;/*升序 * 定义一个范围,为n,然后,让n与之前的所有数进行比较,当遇到比自己小的值时候,拿他+1与自己比较,取最大值即可 * dp[n]=max(dp[n],dp[n-k]+1); * * * if (i == n || arr[i] * 优化原创 2017-02-23 13:06:47 · 498 阅读 · 0 评论 -
最大字段和-蚂蚁的难题2
package 动态规划.最大字段和;import java.util.Scanner;/* * 环形石子问题,数组模拟环 * Vi小于0的时候,表示蚂蚁讨厌这种食材。 * 只能搬一次,但是能够搬走连续一段的食材。 * 因为求得是连续一段,所以最长字段和 * 方式1,遍历每一个节点, * 方式2,求出最长最大字段和, * 在求出最长最小字段和 * 总原创 2017-02-23 13:07:38 · 305 阅读 · 0 评论 -
最大字段和
package 动态规划.最大字段和;import java.util.Scanner;public class 最大字段和 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int k = sc.nextInt();while (k-- > 0) {int原创 2017-02-23 13:07:52 · 256 阅读 · 0 评论 -
最长公共子序列
package 动态规划;import java.util.Scanner;/* * 2个字符串可以任何地方开头,所以就有2状态 * 1:相同 * dp[i][j]=dp[i-1][j-1]+1 * 2:不相同 * dp[i][j]=max(dp[i-1][j],dp[i][j-1]) */public class 最长公共子序列 {public s原创 2017-02-23 12:57:42 · 196 阅读 · 0 评论