动态规划:最长递增子序列 题目描述给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。说明:可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。你算法的时间复杂度应该为 O(n^2) 。d...
dfs、动态规划:数字三角形 题目描述在数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都只能往左下或 右下走。只需要求出这个最大和即可,不必给出具体路径。题目解析dfs思想;每次加上最大的一个dp思想dp[i]代表,每一行第i个位置最大加数,从最后一行开始,与递归方式相反代码 static int[][] ans; public static void main(String[] args) { Scanner scanner=new Scanner(System.in
贪心、动态规划:钢条切割 题目描述Serling公司购买长钢条,将其切割为短钢条出售。切割工序本身没有成本支出。公司管理层希望知道最佳的切割方案。假定我们知道Serling公司出售一段长为i英寸的钢条的价格为pi(i=1,2,…,单位为美元)。钢条的长度均为整英寸。钢条切割问题是这样的:给定一段长度为n英寸的钢条和一个价格表pi(i=1,2,…n),求切割钢条方案,使得销售收益rn最大。注意,如果长度为n英寸的钢条的价格pn足够大,最优解可能就是完全不需要切割。下面另n=10,给出个长度的价格,求价值最大值
算法很美:01背包问题(动态规划、贪心) 题目描述Sidney想去Gandtom家玩。但Sidney家和Gandtom家之间是高低不平、坑坑洼洼的土路。所以他需要用他的背包装几袋稀的泥,在路上铺平一些干的土,使路变成平整的泥土,才能到Gandtom家见到Gandtom。已知现在有n种稀的泥,第i种稀的泥的质量为wi,体积为vi。Sidney的包能装体积不超过V的稀的泥。Sidney出门时携带的稀的泥的质量应该尽可能的大。在此前提下,携带的稀的泥的体积也应该尽可能的大。试求Sidney最多能携带多少质量的稀的泥与此时的最大体积上路。Inpu
贪心:部分背包问题 题目描述有n个物体,第i个物体的重量为wi,价值为vi。在总重量不超过C的情况下让总价值尽量高。每一个物体都可以只取走一部分,价值和重量按比例计算。求最大总价值注意:每个物体可以只拿一部分,因此一定可以让总重量恰好为C。尽可能能拿单价最高的,比如黄金,相同重量情况下价值最高,从大到小选 价值/重量高的,前面的物品全拿,最后一件根据重量拿部分代码public static void main(String[] args) { Scanner scanner=new Scanner(
贪心:构造字典序最小问题 题目描述给一个定长为N的字符串S,构造一个字符串T,长度也为N。起初,T是一个空串,随后反复进行下列任意操作:从S的头部删除一个字符,加到T的尾部从S的尾部删除一个字符,加到T的尾部目标是最后生成的字符串T的字典序尽可能小1≤N≤2000字符串S只包含大写英文字母输入:字符串S输出:字符串T题目解析将输入的字符串倒序,对倒序字符串和源串同时扫描,谁小保存谁,遇到相同的,则比较下一位,直到获取更小一位代码public static void main(String[] args
算法很美:区间调度问题及区间选点问题(贪心) 题目描述有n项工作,每项工作分别在si时间开始,在ti时间结束.对于每项工作,你都可以选择参与与否.如果选择了参与,那么自始至终都必须全程参与.此外,参与工作的时间段不能重复(即使是开始的瞬间和结束的瞬间的重叠也是不允许的).你的目标是参与尽可能多的工作,那么最多能参与多少项工作呢?1≤n≤100000,1≤si≤ti≤109输入:第一行:n第二行:n个整数空格隔开,代表n个工作的开始时间第三行:n个整数空格隔开,代表n个工作的结束时间输出:常数(表示可参与的工作数)
算法很美:硬币支付(贪心) 题目描述有1元,5元,10元,50元,100元,500元的硬币各c1,c5,c10,c50,c100,c500枚.现在要用这些硬币来支付A元,最少需要多少枚硬币?限制条件:0≤ C1,C5,C10,C50,C100,C500≤1000000000,0≤A≤1000000000输入描述:依次输入C1,C5,C10,C50,C100,C500和A,以空格分隔输出描述:输出最少所需硬币数,如果该金额不能由所给硬币凑出,则返回NOWAY算法思想贪心:每次尽可能的多选择可使用的最大面值
算法很没:快速渡河问题 题目描述N个人希望只乘一条船过河,每条船最多只能载两个人。因此,必须安排谁去与回来,以便所有人最快过河。每个人都有不同的划船速度;两个人速度取决于较慢者。请给出时间最短的策略。输入值输入的第一行包含一个整数T(1 <= T <= 20),即测试用例的数量。然后是T例。每例的第一行N,第二行包含N个人过河的秒数。每个案例前面都有一个空白行。人数不超过1000,每人的时间不超过100秒输出量对于每个测试用例,打印一行N个人穿过河流所需的总秒数。解析由于渡河速度取决于两个
算法很美:硬币支付问题(贪心) 题目描述有1元,5元,10元,50元,100元,500元的硬币各c1,c5,c10,c50,c100,c500枚.现在要用这些硬币来支付A元,最少需要多少枚硬币?限制条件0≤ C1,C5,C10,C50,C100,C500≤10000000000≤A≤1000000000输入描述:依次输入C1,C5,C10,C50,C100,C500和A,以空格分隔输出描述:输出最少所需硬币数,如果该金额不能由所给硬币凑出,则返回NOWAY示例1输入3 2 1 3 0 2 620
算法很美:困难的串 题目描述如果一个字符串包含两个相邻的重复子串,则称它为容易的串,其他串称为困难的串,如:BB,ABCDACABCAB,ABCDABCD都是容易的,A,AB,ABA,D,DC,ABDAB,CBABCBA都是困难的。输入正整数n,L,输出由前L个字符(大写英文字母)组成的,字典序第n小的困难的串。例如,当L=3时,前7个困难的串分别为:A,AB,ABA,ABAC,ABACA,ABACAB,ABACABAn指定为4的话,输出ABAC代码 public static void ma
算法很美:素数环(dfs) 题目描述圆环由n个圆组成,如图所示。将自然数1、2,…,n分别放入每个圆,并且两个相邻圆中的数字总和应为质数。注意:第一个圆的数目应始终为1。输入值:n(0 <n <20)。输出量:输出格式如下所示。每一行代表环中从顺时针和逆时针1开始的一系列圆圈编号。数字顺序必须满足上述要求。按字典顺序打印解决方案。您将编写一个完成上述过程的程序。在每种情况下都打印空白行。代码public static void main(String[] args) { Scann
算法很美:n皇后问题 题目描述在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。你的任务是,对于给定的N,求出有多少种合法的放置方法。Input共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。Output共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。解析采用”试探法”:即尝试每个位置是否能放,采用dfs思想,并根据要求即:(即任意2个皇后不允许处在同一排,同一列,
算法很美:水洼数(dfs)深搜 题目描述Descriptions:由于近日阴雨连天,约翰的农场中中积水汇聚成一个个不同的池塘,农场可以用 N x M (1 <= N <= 100; 1 <= M <= 100) 的正方形来表示。农场中的每个格子可以用’W’或者是’.'来分别代表积水或者土地,约翰想知道他的农场中有多少池塘。池塘的定义:一片相互连通的积水。任何一个正方形格子被认为和与它相邻的8个格子相连。给你约翰农场的航拍图,确定有多少池塘InputLine 1: N 和 MLines 2…N+1
算法很美:和为K的连续子数组 题目描述给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。示例 1 :输入:nums = [1,1,1], k = 2输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。说明 :数组的长度为 [1, 20,000]。数组中元素的范围是 [-1000, 1000]整数 k 的范围是 [-1e7, 1e7]。解析记录数组每个位置上的数,与之前所有数的和,扫描次数组若(两项的差额==K)则计数+1代码public static
算法很美:部分和问题 题目描述给定整数序列a1,a2,…,an,判断是否可以从中选出若干数,使它们的和恰好为k。解析采用深搜思想:每次抉择,选or不选当前元素,并以此穷举所有可能,并在穷举过程中,进行“剪枝”。代码public static void main(String[] args) { Scanner scanner=new Scanner(System.in); int n = scanner.nextInt(); int[] a=new int[n]; for (int i = 0;
算法很美:数独游戏 题目描述编写一个程序,通过已填充的空格来解决数独问题。一个数独的解法需遵循如下规则:数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。PS:空白格用 ‘.’ 表示。代码public static void main(String[] args) { char[][] board = new char[][]{ {'5', '3', '.', '.', '7', '.', '
算法很美:小孩上楼梯 题目描述有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。示例1:输入:n = 3输出:4说明: 有四种走法示例2:输入:n = 5输出:13提示:n范围在[1, 1000000]之间解析(递归解法)最优子问题:上一阶楼梯、上二阶楼梯、上三节楼梯,可以理解成,先上一阶楼梯+剩下的楼梯数对应的走法+先上二阶楼梯+剩下楼梯数对应的走法+先上三阶楼梯+剩余楼
代码很美:机器人走格子 题目描述有一个XxY的网格,一个机器人只能走格点且只能向右或向下走,要从左上角走到右下角。请设计一个算法,计算机器人有多少种走法。给定两个正整数int x,int y,请返回机器人的走法数目。保证x+y小于等于12。代码public static void main(String[] args) { Scanner scanner=new Scanner(System.in); int x=scanner.nextInt(); int y=scanner.nextInt();
算法很美:合法括号 题目描述合法括号。设计一种算法,打印n对括号的所有合法的(例如,开闭一一对应)组合分析对所有情况进行枚举,即在上一层结果的基础上,进行“左”、“右”、“包”代码 public static void main(String[] args) { Scanner scanner=new Scanner(System.in); int n=scanner.nextInt(); Set<String> solve = solve(n); //Set<String&