随笔分类 -  ACM_ac算法与函数

摘要:输入: n=3 m=3 a={1,2,3} M=10000 输出: 6 (0+0+3,0+1+2,0+2+1,1+0+2,1+1+1,1+2+0) 为了不重复计数,同一种类的物品最好一次性处理好.于是我们按照如下方式进行定义. dp[i+1][j]=从前i种物品中取出j个的组合总数 复杂度:O(nm 阅读全文
posted @ 2016-03-03 21:02 Vmetrio 阅读(741) 评论(0) 推荐(1)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1242 简单优先队列搜索,自己好久不敲,,,,,手残啊,,,,orz 代码: 1 #include <stdio.h> 2 #include <string.h> 3 #include <math.h> 阅读全文
posted @ 2016-03-02 20:35 Vmetrio 阅读(279) 评论(0) 推荐(0)
摘要:输入: n=3 (w,v)={(3,4),(4,5),(2,3)} W=7 输出: 10(0号物品选1个,2号物品选2个) 和01背包的区别是物品可以任意选择. 令dp[i+1][j]=从前i种物品中挑选任意总重量不超过j时总价值的最大值.那么递推关系为: dp[0][j]=0 dp[i+1][j] 阅读全文
posted @ 2016-03-01 20:55 Vmetrio 阅读(195) 评论(0) 推荐(0)
摘要:给定两个字符串S和T.求出这两个字符串最长的公共子序列的长度. 输入: n=4 m=4 s="abcd" t="becd" 输出: 3("bcd") 这类问题被称为最长公共子序列问题(LCS,Longest Common Subsequence)的著名问题. max(dp[i][j]+1,dp[i] 阅读全文
posted @ 2016-03-01 19:30 Vmetrio 阅读(258) 评论(0) 推荐(0)
摘要:利用记忆化数组.记dp[i][j]为根据rec的定义,从第i个物品开始挑选总重小于j时,总价值的最大值. 递推式: dp[i][j]=0 (j<w[i]) dp[i][j] dp[i][j]= max(dp[i+1][j],dp[i+1][j-w[i]]+v[i]) 反向: 1 int dp[MAX 阅读全文
posted @ 2016-03-01 18:34 Vmetrio 阅读(162) 评论(0) 推荐(0)
摘要:使用记忆化搜索,可大大提升时间效率.... 1 int n,W;//n为重量 2 int w[MAX],v[MAX]; 3 int dp[MAX][MAX]; 4 5 //从第i个物品开始挑选总重小于j的部分 6 int rec(int i,int j) 7 { 8 //记忆化搜索 9 /*if(d 阅读全文
posted @ 2016-02-29 20:27 Vmetrio 阅读(840) 评论(0) 推荐(0)
摘要:木板长为:21 输入: N=3 L={8,5,8} 输出: 34 由于木板的切割顺序不确定,自由度很高.首先,切割的方法可以参见二叉树,每一个叶子节点就对应了切割出的一块块木板.叶子节点的深度就对应了为了得到对应木板所需的切割次数,开销的合计就是个叶子节点的 木板的长度*节点的深度 的总和. 最短的 阅读全文
posted @ 2016-02-29 11:00 Vmetrio 阅读(851) 评论(0) 推荐(0)
摘要:输入: N=6 R=10 X={1,7,15,20,30,50} 输出: 3 可从最左边的点开始,距离为R以内的最远的点.因为最左的区域没有覆盖的意义,所以应该尽可能覆盖靠右的点.不断重复此过程. 1 int N,R; 2 int X[MAX]; 3 4 void solve() 5 { 6 sor 阅读全文
posted @ 2016-02-29 10:26 Vmetrio 阅读(189) 评论(0) 推荐(0)
摘要:输入: n=6 S="ACDBCB" 输出: ABCBCD 不断取S的开头和末尾中较小的一个字符放到T的末尾 1.按照字典序比较S和将S反转后的字符串'S'. 2.如果S较小,就从S的开头取出一个文字,追加到T的末尾. 3.如果S较小,就从S的末尾取出一个文字,追加到T的末尾. 1 const in 阅读全文
posted @ 2016-02-29 10:07 Vmetrio 阅读(214) 评论(0) 推荐(0)
摘要:有1元、5元、10元、50元、100元、500元的硬币各C1 C5 C10 C50 C100 C500 。现在要用这些硬币来支付A元,最少需要多少枚硬币? 优化使用面值大的硬币。 贪心法就是遵循某种规则,不断贪心地选取当前最优策略的算法设计方法. 搜索算法和动态规划算法是在多种策略中选取最优解,而贪 阅读全文
posted @ 2016-02-28 20:43 Vmetrio 阅读(704) 评论(0) 推荐(0)
摘要:调用函数时,主调的函数所拥有的局部变量等信息需要存储在特定的内存区域.这个区域被称作栈内存区.另一方面,利用new或者malloc进行分配的内存区域被称为堆内存. 栈内存在程序启动时被统一分配,此后不能再扩大.由于这一区域有上限,所以函数的递归深度也有上限.虽然与函数中定义的局部变量的数目有关,不过 阅读全文
posted @ 2016-02-27 21:31 Vmetrio 阅读(219) 评论(0) 推荐(0)
摘要:SLT: C++的STL有一个函数可以方便地生成全排列,这就是next_permutation 在C++ Reference中查看了一下next_permutation的函数声明: #include <algorithm>bool next_permutation( iterator start, 阅读全文
posted @ 2016-02-27 20:44 Vmetrio 阅读(332) 评论(0) 推荐(0)
摘要:N*M的迷宫,从起点到终点,求最短距离 宽度优先搜索按照距开始状态由近及远的顺序进行搜索,因此可以很容易的用来求最短路径,最少操作之类问题的答案. (可以构造成pair或者编码成int来表达状态) 当状态更加复杂时,就需要封装成一个类来表示状态了. 虽然到达终点时就会停止搜索,可如果继续下去直到队列 阅读全文
posted @ 2016-02-27 16:18 Vmetrio 阅读(3518) 评论(0) 推荐(0)
摘要:N*M的园子,雨后积起了水.八连通的积水背认为是连接在一起的.请求出园子里总共有多少水洼? dfs(Depth-First Search) 八个方向的简单搜索.... 深度优先搜索从最开始的状态出发,遍历所有可以到达的状态.由此可以对所有的状态进行操作,或者列举出所有的状态. 1 int N,M; 阅读全文
posted @ 2016-02-27 14:58 Vmetrio 阅读(377) 评论(0) 推荐(0)
摘要:输入: n=4 a={1,2,4,7} k=13 输出: YES 输入: n=4 a={1,2,4,7} k=13 输出: NO 选出若干数,使它们的和恰好为k 1 #include <stdio.h> 2 #include <string.h> 3 #include <math.h> 4 #inc 阅读全文
posted @ 2016-02-27 12:34 Vmetrio 阅读(487) 评论(0) 推荐(0)
摘要:STL: 队列中pop完成的不是取出最顶端的元素,而是取出最低端的元素.也就是说最初放入的元素能够最先被取出(这种行为被叫做FIFO:First In First Out,即先进先出). queue:front 是用来访问最底端数据的函数. 1 #include <queue> 2 #include 阅读全文
posted @ 2016-02-27 12:09 Vmetrio 阅读(206) 评论(0) 推荐(0)
摘要:STL: pop:完成的仅仅是移除最顶端的数据.如果访问最顶端的数据,需要使用top函数(这个操作通常也被称为peek). 1 #include <stack> 2 #include <cstdio> 3 uisng namespace std; 4 5 int main() 6 { 7 stack 阅读全文
posted @ 2016-02-27 12:05 Vmetrio 阅读(161) 评论(0) 推荐(0)
摘要:问题:将写有数字的N个纸片放入口袋中,你可以从口袋中抽取4次纸片,每次记下纸片上的数字后都将其放回口袋中.如果这4个数字的和是M,就是你赢,否则就是你的朋友赢. 很容易就可以写出下边的代码: 1 for(int a=0; a<n; a++){ 2 for(int b=0; b<n; b++){ 3 阅读全文
posted @ 2016-02-26 21:02 Vmetrio 阅读(902) 评论(0) 推荐(0)
摘要:来自:http://blog.csdn.net/tigerjibo/article/details/6442151 sscanf 名称: sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: int sscanf( const char *, const char *, ... 阅读全文
posted @ 2016-02-16 17:44 Vmetrio 阅读(226) 评论(0) 推荐(0)
摘要:转载链接:http://www.cnblogs.com/PJQOOO/p/3897745.html第一步:先计算最长公共子序列的长度。实现第一步: 设一个C[i][j]: 保存Xi与Yj的LCS的长度。 设X = { x1~xm },Y = { y1~yn }及它们的最长子序列Z = { z1~z... 阅读全文
posted @ 2015-10-21 20:43 Vmetrio 阅读(295) 评论(0) 推荐(0)