摘要: 题目描述:回文串就是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。回文子串,顾名思义,即字符串中满足回文性质的子串。给出一个只由小写英文字符a,b,c...x,y,z组成的字符串,请输出其中最长的回文子串的长度。思路1. 使用枚举法判断, 时间复杂度会到 o(n^3)2. 动规的记忆化搜索, 时间复杂度会降到 o(n^2)3. leetcode 给出了一个算法, 将时间复杂度降低到 o(n)代码#include #include #include using namespace std;char ori[200010];char ist[500020];int 阅读全文
posted @ 2014-03-04 20:30 SangS 阅读(393) 评论(0) 推荐(0) 编辑
摘要: 总结1. getline(cin, string)2. getline 不能和 scanf 联合使用. 联合使用的话, 一个数会被读入多次题目描述:小明手中有很多字符串卡片,每个字符串中都包含有多个连续的空格,而且这些卡片在印刷的过程中将字符串的每个子串都打印反了,现在麻烦你帮小明将这些字符串中的子串修正过来,同时为了使卡片美观,压缩其中的连续空格为1个。思路1. 题目本身并没有什么难度, 主要是看懂题. 题目要求的是压缩空格, 不是删除空格. WA 了很多次代码#include #include #include #include #include using namespace std;c 阅读全文
posted @ 2014-03-04 20:19 SangS 阅读(270) 评论(0) 推荐(0) 编辑
摘要: 题目描述:假如已知有n个人和m对好友关系(存于数字r)。如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈。假如:n = 5 , m = 3 , r = {{1 , 2} , {2 , 3} , {4 , 5}},表示有5个人,1和2是好友,2和3是好友,4和5是好友,则1、2、3属于一个朋友圈,4、5属于另一个朋友圈,结果为2个朋友圈。思路1. 裸的并查集, 回顾下并查集的知识2. 并查集主要有两个操作, 一个是 merge, 一个是 find. find 用于找到一个集合的标志, merge 用于合并两个集合. 在实 阅读全文
posted @ 2014-03-04 20:16 SangS 阅读(776) 评论(0) 推荐(0) 编辑
摘要: 题目描述:给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首尾是相连的。数组中一个或多个连续元素可以组成一个子数组,其中存在这样的子数组arr[i],…arr[n-1],arr[0],…,arr[j],现在请你这个ACM_Lover用一个最高效的方法帮忙找出所有连续子数组和的最大值(如果数组中的元素全部为负数,则最大和为0,即一个也没有选)思路1. 本以为这题与 Leetcode 上 Gas Station 一样, 提交之后也能通过 2 个 case, 但最终通过一组数据 (2 1 -3 2) 决定了 Gas Station 的做法不正确2. 分两种情况 阅读全文
posted @ 2014-03-04 20:09 SangS 阅读(891) 评论(0) 推荐(0) 编辑
摘要: 题目描述:现在有一个8*8的棋盘,上面放着64个不同价值的礼物,每个小的棋盘上面放置一个礼物(礼物的价值大于0小于100),一个人初始位置在棋盘的左上角,每次他只能向下或向右移动一步,并拿走对应棋盘上的礼物,结束位置在棋盘的右下角。从棋盘的左上角移动到右下角的时候的,每次他只能向下或向右移动一步,并拿走对应棋盘上的礼物,但是拿到的所有的礼物的价值之和不大于一个限定值limit,请设计一个算法请实现,使其能够获得不超过限制值limit的最大价值的礼物。思路1. 在棋盘问题的基础上加了一个限制, 礼物数不能超过 limit2. 这个限制使得状态转移方程需要进行一下变形3. dp[i][j][k] 阅读全文
posted @ 2014-03-04 13:30 SangS 阅读(586) 评论(0) 推荐(0) 编辑
摘要: 题目描述:小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在游戏中购买各种装备来提升自己。有一天,他突然很想知道这些纸币的组合不能表示的最小面额是多少,请聪明的你来帮助小虎来解决这个财政问题吧思路1. 面值最小额度, 枚举的话时间复杂度为 o(n^3). 但思考一下就会发现其实这是背包问题恰好装满的变形题2. 背包问题恰好装满是在朴素背包问题的基础上初始化 dp[0] = 0, dp[i] = 负无穷. 这样就会使得不能恰好装满的容量都是负无穷3. 下面的代码设置的是 int dp[], 其实设置成 bool dp[] 也是可以的代码#includ 阅读全文
posted @ 2014-03-04 13:24 SangS 阅读(358) 评论(0) 推荐(0) 编辑
摘要: 题目描述:最长不重复子串就是从一个字符串中找到一个连续子串,该子串中任何两个字符都不能相同,且该子串的长度是最大的。思路Leetcode 原题设置两个游标, 右边游标向右走, 出现重复字符时, 左边的游标向右走代码#include #include #include using namespace std;int myHash[30];char arr[10010];int main() { while(scanf("%s", arr) != EOF) { memset(myHash, 0, sizeof(myHash)); int len = str... 阅读全文
posted @ 2014-03-04 13:17 SangS 阅读(388) 评论(0) 推荐(0) 编辑
摘要: 题目描述:现在有一个8*8的棋盘,上面放着64个价值不等的礼物,每个小的棋盘上面放置一个礼物(礼物的价值大于0小于1000),一个人的初始位置在棋盘的左上角,每次他只能向下或向右移动一步,并拿走对应棋盘上的礼物,结束位置在棋盘的右下角,请设计一个算法使其能够获得最大价值的礼物。思路Leetcode 原题dp[i][j] 表示 在第 (i,j) 个格子上能够获得的最大价值的礼物状态转移方程为dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + matrix[i][j]这题不应该再贴上, 不过上次做括号匹配没构造出状态转移方程, 那题与此题思路是类似的状态方程的求解, 阅读全文
posted @ 2014-03-04 12:40 SangS 阅读(530) 评论(0) 推荐(1) 编辑
摘要: 总结1. 更新动规矩阵时, 不要 push 更新, 要用 pull更新. push 更新容易让逻辑出问题, 自己卡了很久, 改用 pull 就变得很顺利了2. acm 题, 空间至多是百万, 再网上就会超的3. 曾做过一道题, 和这个类似. 好像是背包问题的一个变形把, 核心都是降维. 降维的过程又是一道动规题目题目描述:给定一个大小为n的数组,数组的元素a[i]代表第i天的股票价格设计一个算法,计算在最多允许买卖k次(一买一卖记为一次)的条件下的最大收益需要注意的是,你不能同时拥有两份股票。也就是说在下次买入前,你必须把手头上原有的股票先卖掉思路1. 假设 dp[i][j] 表示前 i 天, 阅读全文
posted @ 2014-03-04 01:07 SangS 阅读(1153) 评论(1) 推荐(0) 编辑
摘要: 题目描述:给定一个整型数组, 求这个数组的最长严格递增子序列的长度。 譬如序列1 2 2 4 3 的最长严格递增子序列为1,2,4或1,2,3.他们的长度为3。思路1. 朴素求解 LIS, 没什么可说的2. 又涉及到二分查找, 这次找的是大于等于 target 的最小值. = 时直接返回, 这就简单了. low > high 时, 返回 low, 因为上一轮比较, mid #include using namespace std;int arr[100010];int record[100010];int search(int x, int low, int high) { if(low 阅读全文
posted @ 2014-03-04 00:55 SangS 阅读(232) 评论(0) 推荐(0) 编辑
摘要: 题目描述:给定两个整型数组A和B。我们将A和B中的元素两两相加可以得到数组C。譬如A为[1,2],B为[3,4].那么由A和B中的元素两两相加得到的数组C为[4,5,5,6]。现在给你数组A和B,求由A和B两两相加得到的数组C中,第K小的数字。思路1. 多年前第一次搞这道题就没弄出来, 今天是大概记得做法, 不过 failed again, 总结起来, 仍然是没有意识到 int 的特殊性, 即 (int+int)/2 得到的仍然是 int2. 涉及到二分查找, 用我以前总结的步骤来做, 非常顺利. 核心就是 mid = target, high = mid-1, 尝试向左. 最后返回的应该是 阅读全文
posted @ 2014-03-04 00:46 SangS 阅读(639) 评论(0) 推荐(0) 编辑
摘要: 题目描述:给定一棵无向树, 我们选择不同的节点作为根节点时,可以得到不同的高度(即树根节点到叶子节点距离的最大值), 现在求这棵树可能的最低高度。思路1. 刚开始题目都没看懂. 树的高度, 指的是根节点到叶节点的最大值, 我们要做的是找到最大值中的最小值2. 查了下资料, 发现这道题是裸求树的直径3. 树的直径可以用动规求解, 但基本的求法是用两次 BFS(DFS)4. BFS 的求解过程为, (1) 从任意节点 u 出发, 找到其能够达到的最远的节点 v (2) 再从 v 出发, 找到其能够达到的最远的节点 o (3) v,o 之间的距离就是树的直径 (4) 直径的一半就是所要求的高度证明 阅读全文
posted @ 2014-03-04 00:34 SangS 阅读(1057) 评论(0) 推荐(1) 编辑