上一页 1 ··· 7 8 9 10 11 12 13 14 15 ··· 31 下一页
摘要: 题目描述:小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在游戏中购买各种装备来提升自己。有一天,他突然很想知道这些纸币的组合不能表示的最小面额是多少,请聪明的你来帮助小虎来解决这个财政问题吧思路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) 编辑
摘要: 题目代码#include #include using namespace std;int candys[100010];int left1[100010];int right1[100010];int main() { //freopen("testcase.txt", "r", stdin); int n; while(scanf("%d", &n) != EOF) { for(int i = 0; i candys[i-1]) left1[i] = left1[i-1] +1; else ... 阅读全文
posted @ 2014-03-02 21:48 SangS 阅读(232) 评论(0) 推荐(0) 编辑
摘要: 题目描述:给定两个正整数a,b(1#include #include using namespace std;int gcd(int x, int y) { if(x == 1 || y == 1) return 1; if(x == y) return x; if(y > x) swap(x,y); if((x&1) && (y&1)) { return gcd(x-y, y); }else if((x&1) &&(!(y&1))) { return gcd(x, y/2); }else... 阅读全文
posted @ 2014-03-02 21:46 SangS 阅读(259) 评论(0) 推荐(0) 编辑
摘要: 题目描述:已知有面值为1元,2元,5元,10元,20元,50元,100元的货币若干(可认为无穷多),需支付价格为x的物品,并需要恰好支付,即没有找零产生。求,至少需要几张货币才能完成支付。如,若支付价格为12元的物品,最少需要一张10元和一张2元,即两张货币就可完成支付。思路1. 先用完全背包的思想考虑了一下, 甚至还计算2^40 个 int 相当于多大空间2. 然后考虑到一个优化, 100 元以上的直接用 100 付就好了嘛, 然后... 这又是道水题代码#include #include using namespace std;int money[10]; void init() { .. 阅读全文
posted @ 2014-03-02 21:40 SangS 阅读(241) 评论(0) 推荐(0) 编辑
上一页 1 ··· 7 8 9 10 11 12 13 14 15 ··· 31 下一页