- 浏览: 1653468 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (405)
- C/C++ (16)
- Linux (60)
- Algorithm (41)
- ACM (8)
- Ruby (39)
- Ruby on Rails (6)
- FP (2)
- Java SE (39)
- Java EE (6)
- Spring (11)
- Hibernate (1)
- Struts (1)
- Ajax (5)
- php (2)
- Data/Web Mining (20)
- Search Engine (19)
- NLP (2)
- Machine Learning (23)
- R (0)
- Database (10)
- Data Structure (6)
- Design Pattern (16)
- Hadoop (2)
- Browser (0)
- Firefox plugin/XPCOM (8)
- Eclise development (5)
- Architecture (1)
- Server (1)
- Cache (6)
- Code Generation (3)
- Open Source Tool (5)
- Develope Tools (5)
- 读书笔记 (7)
- 备忘 (4)
- 情感 (4)
- Others (20)
- python (0)
最新评论
-
532870393:
请问下,这本书是基于Hadoop1还是Hadoop2?
Hadoop in Action简单笔记(一) -
dongbiying:
不懂呀。。
十大常用数据结构 -
bing_it:
...
使用Spring MVC HandlerExceptionResolver处理异常 -
一别梦心:
按照上面的执行,文件确实是更新了,但是还是找不到kernel, ...
virtualbox 4.08安装虚机Ubuntu11.04增强功能失败解决方法 -
dsjt:
楼主spring 什么版本,我的3.1 ,xml中配置 < ...
使用Spring MVC HandlerExceptionResolver处理异常
问题:Consider an arbitrary sequence of integers. One can place + or - operators between integers in the sequence, thus deriving different arithmetical expressions that evaluate to different values. Let us, for example, take the sequence: 17, 5, -21, 15. There are eight possible expressions:
17 + 5 + -21 + 15 = 16
17 + 5 + -21 - 15 = -14
17 + 5 - -21 + 15 = 58
17 + 5 - -21 - 15 = 28
17 - 5 + -21 + 15 = 6
17 - 5 + -21 - 15 = -24
17 - 5 - -21 + 15 = 48
17 - 5 - -21 - 15 = 18
We call the sequence of integers divisible by K if + or - operators can be placed between integers in the sequence in such way that resulting value is divisible by K. In the above example, the sequence is divisible by 7 (17+5+-21-15=-14) but is not divisible by 5.
You are to write a program that will determine divisibility of sequence of integers.
Input
There are multiple test cases, the first line is the number of test cases.
The first line of each test case contains two integers, N and K (1 ≤ N ≤ 10000, 2 ≤ K ≤ 100) separated by a space.
The second line contains a sequence of N integers separated by spaces. Each integer is not greater than 10000 by it's absolute value.
Output
Write to the output file the word "Divisible" if given sequence of integers is divisible by K or "Not divisible" if it's not.
Sample Input
2
4 7
17 5 -21 15
4 5
17 5 -21 15
Sample Output
Divisible
Not divisible
这道题目就是在给定的一堆数中,添加+ -号,判断一下结果是否能整除给定的K.
这道题首先给人的感觉是穷举/搜索,但是给的数在10000以内,穷举的话是2^n,最坏情况10000个数,如果不可整除,计算出来时间是相当长的.
而把指数级复杂度变为多项式级别的可以考虑动态规划.
这道题的动态规划信息非常隐蔽,因为如果直接把这些数的运算划分为子问题的话,这些子问题都将是不重复的.而动态规划是通过记住子问题的最优解来避免重复计算而提高效率的.
但仔细分析这道题,我们发现其实没有必要真正求出表达式的值,我们只要把每一步计算结果
的对k的余数记住就行了.这样每一步的计算结果就在0~K之间了.如果我们把这个计算过程表示为树形结构的话
a1
/ \
a1-a2 a1+a2
/ \ / \
a1-a2-a3 a1-a2+a3 a1+a2-a3 a1+a2+a3
...................................
这样第j层就会有2^j个计算的结果,而如果我们每次计算的时候都对k求模,这样这2^j个值
都在0~k-1之间,而如果一层中的两个节点的值一样,那么显然可以在计算第一个节点的值是否能被k整除后把这个结果保存下来,再遇到这样同一个值的可以直接查找到,事实上这样重复的节点计算是相当多的--(指数级别2^j的数在常量0~k范围).这样我们把一棵树的宽度约束在了1~k的范围了,而高度是N,所以复杂度变成了多项式级别O(k*N)了:
代码如下:
17 + 5 + -21 + 15 = 16
17 + 5 + -21 - 15 = -14
17 + 5 - -21 + 15 = 58
17 + 5 - -21 - 15 = 28
17 - 5 + -21 + 15 = 6
17 - 5 + -21 - 15 = -24
17 - 5 - -21 + 15 = 48
17 - 5 - -21 - 15 = 18
We call the sequence of integers divisible by K if + or - operators can be placed between integers in the sequence in such way that resulting value is divisible by K. In the above example, the sequence is divisible by 7 (17+5+-21-15=-14) but is not divisible by 5.
You are to write a program that will determine divisibility of sequence of integers.
Input
There are multiple test cases, the first line is the number of test cases.
The first line of each test case contains two integers, N and K (1 ≤ N ≤ 10000, 2 ≤ K ≤ 100) separated by a space.
The second line contains a sequence of N integers separated by spaces. Each integer is not greater than 10000 by it's absolute value.
Output
Write to the output file the word "Divisible" if given sequence of integers is divisible by K or "Not divisible" if it's not.
Sample Input
2
4 7
17 5 -21 15
4 5
17 5 -21 15
Sample Output
Divisible
Not divisible
这道题目就是在给定的一堆数中,添加+ -号,判断一下结果是否能整除给定的K.
这道题首先给人的感觉是穷举/搜索,但是给的数在10000以内,穷举的话是2^n,最坏情况10000个数,如果不可整除,计算出来时间是相当长的.
而把指数级复杂度变为多项式级别的可以考虑动态规划.
这道题的动态规划信息非常隐蔽,因为如果直接把这些数的运算划分为子问题的话,这些子问题都将是不重复的.而动态规划是通过记住子问题的最优解来避免重复计算而提高效率的.
但仔细分析这道题,我们发现其实没有必要真正求出表达式的值,我们只要把每一步计算结果
的对k的余数记住就行了.这样每一步的计算结果就在0~K之间了.如果我们把这个计算过程表示为树形结构的话
a1
/ \
a1-a2 a1+a2
/ \ / \
a1-a2-a3 a1-a2+a3 a1+a2-a3 a1+a2+a3
...................................
这样第j层就会有2^j个计算的结果,而如果我们每次计算的时候都对k求模,这样这2^j个值
都在0~k-1之间,而如果一层中的两个节点的值一样,那么显然可以在计算第一个节点的值是否能被k整除后把这个结果保存下来,再遇到这样同一个值的可以直接查找到,事实上这样重复的节点计算是相当多的--(指数级别2^j的数在常量0~k范围).这样我们把一棵树的宽度约束在了1~k的范围了,而高度是N,所以复杂度变成了多项式级别O(k*N)了:
代码如下:
#include<iostream> #include<string> using namespace std; int flag[10005][105]; int a[1005]; int n,K,N; //@return 返回是否可以整除K,@parm level递归形成二叉数的层数,vaule为该层一个计算出节点的值 int f(int level,int value){ if(flag[level][value] != -1) return flag[level][value];//如果已经记录过了,就直接返回 int check,t1,t2; t1 = (value + a[level]) % K;//进行+运算并对K取余数 t2 = (value - a[level]) % K;//进行-运算并对K取余数 t1 = t1 < 0 ? t1 + K : t1;//余数都改成正的 t2 = t2 < 0 ? t2 + K : t2; if(level == N) check = (value % K == 0) ? 1 : 0;//如果第N层,递归出口,判断 value 是否可以整除K else if(f(level + 1,t1) == 1) check = 1;//如果level + 1层计算结果可以整除K,则标记check为1,同时可以跳过另一个分支,因为0-a,0+a对最终判断否是否可以整除K的效果是一样的 else if( f(level + 1,t2) == 1 ) check = 1; else check = 0;//左右分支均不可以整除 check=0; return flag[level][value] = check;//返回并记录本层的check值 } int main(){ int m; int i,j; string result; cin >> n; for(i = 0; i < n; i++){ cin >> N >> K; for(j = 0; j < N; j++){ cin >> a[j]; if((a[j] %= K) < 0) a[j] += K; } for(j = 0; j <= N; j++) for(m = 0; m <= K; m++) flag[j][m] = -1; result = f(1,a[0]) == 1 ? "Divisible" : "Not divisible" ; cout << result << endl; } return 0; }
发表评论
-
二分查找之变型题目
2010-10-24 12:40 2158二分查找算法在各个公司的笔试面试题大量出现,通常不是简单一眼就 ... -
一道笔试题(创新工厂)解法
2010-10-21 17:44 1855一个帖子http://www.iteye.com/topic/ ... -
[zz]大数据量,海量数据 处理方法总结
2010-08-27 22:24 2273大数据量的问题是很多面试笔试中经常出现的问题,比如baidu ... -
Trie and suffix array
2010-04-13 20:54 1927字典数Trie和后缀数组suffix array是处理字符串操 ... -
金币问题
2009-11-09 08:41 2018今年某公司的笔试题: 一个矩阵地图,每一个元素值代表金币数, ... -
楼梯问题
2009-11-09 08:19 1577hl给我的几道某公司的算法题: 1、 有个 100 级的 ... -
一道考察模拟乘法的题目
2009-11-07 22:37 1422今天hl和我讨论一道题目: 写道 整形数组如a={1,4, ... -
链表归并
2009-11-07 21:40 1038以前gx同学问的某某公司的笔试题,写一下练练(纯手写,没编译过 ... -
找出出现次数超过一半的数字
2009-11-07 21:23 1891hl同学问我一道这个题,想了一种方法,感觉还是不错的,只扫描一 ... -
有道难题以超低分晋级
2009-06-10 11:36 1568有道难题比赛居然晋级了,可以领到一个t-shirt。 -
逆序数/逆序数对
2009-06-09 23:17 3784逆序数是个常遇到的问题,主要有两种解法: O(n^2)的方法: ... -
有道难题topcoder
2009-05-31 23:55 2461今天做了有道topcoder的题目,也是第一次在topcode ... -
百度之星第一场题目
2009-05-31 00:03 3653由于不符合参赛条件,未能参加百度之星,看了题目还挺有意思,把题 ... -
一个对字符串很好的Hash函数ELFHHash
2009-05-03 21:41 2282#include<stdio.h> #defin ... -
最大流Ford-Fulkerson算法
2009-04-22 17:33 9685算法导论对最大流算法有很详细的介绍,今天实现了最大流Ford- ... -
大数/高精度加减乘除取模[收藏]
2009-04-16 19:38 5068#include <iostream> #i ... -
带重复数字的全排列
2009-04-16 18:58 3894上次gx同学问我一道又重复数字的全排列的问题,我当时用set保 ... -
差分约束系统
2009-04-15 16:00 3747(本文假设读者已经有以下知识:最短路径的基本性质、Bellma ... -
二分图匹配
2009-04-15 15:40 3730二分图最大匹配的匈牙利算法 二分图是这样一个图,它的顶点可以分 ... -
线段树
2009-03-24 10:58 1688把问题简化一下: 在自然数,且所有的数不大于30000的 ...
相关推荐
程序代码提供了一个 C++ 实现,通过包含头文件和宏定义来初始化动态规划数组 dp 的大小,并定义了求解最长公共子序列长度的 LCSlength 函数和反向构建最长公共子序列的 Buildsubs 函数。main 函数中初始化了两个示例...
在这个“算法设计与分析之动态规划求解硬币问题”的案例中,我们将探讨如何使用动态规划方法来解决一个经典的组合优化问题:硬币找零问题。 硬币找零问题的基本设定是这样的:你有一组不同面值的硬币,目标是找出...
约瑟夫问题(Josephus Problem)是一个著名的理论问题,源于公元前一世纪犹太历史学家约瑟夫·弗拉维乌斯的叙述。该问题在计算机科学和算法设计中有着广泛的应用,因为它涉及到循环和计数的策略。在这个问题中,人们...
* 从算法分析与设计的角度,对基于DP法求解问题的理解 实验步骤 步骤 1:理解问题,给出问题的描述。 步骤 2:算法设计,包括策略与数据结构的选择 步骤 3:描述算法,可以采用伪代码、流程图等形式。 步骤 4:...
在矩阵乘法中,我们可以构建一个二维数组dp,其中dp[i][j]表示计算前i行和前j列的子矩阵乘积所需的最小运算次数。我们可以通过比较计算AB然后与第i行乘以C的代价和计算BC然后与第i列乘以A的代价来填充这个数组。 ...
### 数学建模中动态规划问题的原理分析及MATLAB求解过程 #### 一、动态规划概述 ##### 1.1 动态规划的发展及研究内容 动态规划(Dynamic Programming,简称DP)是由美国数学家Richard Bellman于20世纪50年代提出...
在数位DP模板中,通常包含一个数字处理函数,这个函数的作用是将一个整数分解为它的每一位数字,并且为后续的DFS操作做好准备。通过不断递归调用DFS函数,我们可以从高位到低位处理每一位数字,直到完成整个数字的...
在提供的文件列表中,有一个名为"DP.m"的文件,这很可能是一个MATLAB程序,实现了DP_OMP算法。MATLAB是一种强大的数值计算和可视化工具,常用于科学计算和工程应用。这个文件可能包含了算法的详细实现,包括初始化、...
约瑟夫斯问题(Josephus Problem)是一个著名的理论问题,源于古罗马历史学家约瑟夫斯的叙述。在历史上,约瑟夫斯面临生死抉择,他和他的41个同伴被敌人包围,他们决定以一种循环报数的方式决定谁将幸免于难。每数到...
最大子段和问题,也被称为连续子数组的最大和问题,是计算机科学中一个经典的问题,尤其是在算法设计和分析领域。该问题的目的是找到一个数组中连续子数组的最大和。这个问题在许多实际应用中都有体现,比如股票投资...
当一个问题的最优解包含其子问题的最优解时,我们称该问题具有最优子结构。而重叠子问题意味着在求解过程中会反复遇到相同的子问题,为了避免重复计算,我们可以使用存储子问题解的方法,即记忆化搜索,或者通过自底...
TSP旅行商问题(Traveling Salesman Problem)是一个经典的NP-hard问题,旨在找到一条最短的路径,使得旅行商可以访问每个城市一次然后返回出发点。以下是关于动态规划法、回溯法和分支限界法在TSP问题上的应用。 ...
- **问题描述**:有n个物品和一个背包,背包的最大容量为V。对于每个物品i,它有一个体积v[i]和一个价值w[i]。问如何选择物品装入背包,使得背包中物品的总价值最大。 - **状态定义**:dp[i][j]表示前i个物品放入...
动态规划(Dynamic Programming,简称DP)是计算机科学中一种强大的解决问题的方法,尤其在算法设计领域,它被广泛应用于解决最优化问题...0-1背包问题只是DP应用的一个例子,实际中还有许多其他问题可以运用DP来求解。
在本项目中,我们主要探讨的是“汽车加油行驶问题”,这是一个经典的计算机算法问题,通常用于教学C语言的算法设计和分析。这个问题的核心是模拟一辆汽车在有限次加油的情况下,尽可能远距离行驶。以下是对该问题的...
6. **最优子结构**:如果一个问题的最优解包含其子问题的最优解,则该问题具有最优子结构的性质。 #### 三、代码分析 文档中给出了三种不同的实现方式: 1. **第一种实现**: - 使用了三维数组`dp`来存储不同...
可满足性问题(Satisfiability Problem, SAT)是计算科学领域中的一个经典问题,在数理逻辑、人工智能、机器学习、VLSI集成电路设计与检测、数据库检索等多个领域都有着重要的应用价值。针对这一问题,已经发展出了...
程序t.rar"压缩包中,很可能包含了一个用MATLAB编写的解决TSP问题的程序。MATLAB提供了丰富的数学函数和工具,使得实现TSP的各种算法变得相对简单。 1. **遗传算法(Genetic Algorithm)**:遗传算法是一种模拟自然...