**
*
*/
package study.puzzle.sample1;
import java.util.*;
import junit.framework.TestCase;
/**
* DOCUMENT ME!
*
* @author Godlikeme 2007-3-20
*/
public class Algorithm1Test extends TestCase {
public void testCompute() throws Exception {
// assertEquals(,Algorithm.compute(""));
assertEquals(1, Algorithm.compute("A"));
assertEquals(1, Algorithm.compute("B"));
assertEquals(1, Algorithm.compute("AA"));
assertEquals(2, Algorithm.compute("AB"));
assertEquals(2, Algorithm.compute("BA"));
assertEquals(1, Algorithm.compute("BB"));
assertEquals(1, Algorithm.compute("AAA"));
assertEquals(3, Algorithm.compute("AAB"));
assertEquals(5, Algorithm.compute("ABA"));
assertEquals(3, Algorithm.compute("ABB"));
assertEquals(3, Algorithm.compute("BAA"));
assertEquals(5, Algorithm.compute("BAB"));
assertEquals(3, Algorithm.compute("BBA"));
assertEquals(1, Algorithm.compute("BBB"));
assertEquals(1, Algorithm.compute("AAAA"));
assertEquals(4, Algorithm.compute("AAAB"));
assertEquals(9, Algorithm.compute("AABA"));
assertEquals(6, Algorithm.compute("AABB"));
assertEquals(9, Algorithm.compute("ABAA"));
assertEquals(16, Algorithm.compute("ABAB"));
assertEquals(11, Algorithm.compute("ABBA"));
assertEquals(4, Algorithm.compute("ABBB"));
assertEquals(1, Algorithm.compute("AAAA"));
assertEquals(1, Algorithm.compute("BBBB"));
assertEquals(1, Algorithm.compute("BBBBBBBBBBBBBBBBB"));
assertEquals(1, Algorithm.compute("AAAAAAAAAAAAAAAAAAA"));
assertEquals(40932737,Algorithm.compute("AAAAABBAABBAAAAA"));
assertEquals(
"77961101052771906279054003892476957478231542072323497761785202067698072199176691641558426633749048526359312876540673943650496621566256840081699153379703191232351264431848226789053430627229534974255679805774570964054601540378538438843097861227735459941778654699563308336374269767832682962176221580822415371619054678180592255250557108283479859134366715129117248030015013252495410340365746159653594812237689092688329502816565884197840680643248615557790386065427220993356310034524724459592233757880705810389624854250116398499956155395244214595828664435566808211796623188",
Algorithm1
.compute(
"AAAAAABBBBBBBBAAAAAAAAABBBBBBBBAAAAAAAAABBBBBB"
+ "AAAAAABBBBBBBBAAAAAAAAABBBBBBBBAAAAAAAAABBBBBB"
+ "AAAAAABBBBBBBBAAAAAAAAABBBBBBBBAAAAAAAAABBBBBB"
+ "AAAAAABBBBBBBBAAAAAAAAABBBBBBBBAAAAAAAAABBBBBB"
+ "AAAAAABBBBBBBBAAAAAAAAABBBBBBBBAAAAAAAAABBBBBB"
+ "AAAAAABBBBBBBBAAAAAAAAABBBBBBBBAAAAAAAAABBBBBB"
+ "AAAAAABBBBBBBBAAAAAAAAABBBBBBBBAAAAAAAAABBBBBB"
+ "AAAAAABBBBBBBBAAAAAAAAABBBBBBBBAAAAAAAAABBBBBB"
+ "").toString());
}}
/**
*
* 假设有这样一种字符串,它们的长度不大于 26 ,而且若一个这样的字符串其长度为 m ,则这个字符串必定由 a, b, c ... z 中的前 m
* 个字母构成,同时我们保证每个字母出现且仅出现一次。比方说某个字符串长度为 5 ,那么它一定是由 a, b, c, d, e 这 5
* 个字母构成,不会多一个也不会少一个。嗯嗯,这样一来,一旦长度确定,这个字符串中有哪些字母也就确定了,唯一的区别就是这些字母的前后顺序而已。
* 现在我们用一个由大写字母 A 和 B 构成的序列来描述这类字符串里各个字母的前后顺序: 如果字母 b 在字母 a 的后面,那么序列的第一个字母就是 A
* (After),否则序列的第一个字母就是 B (Before); 如果字母 c 在字母 b 的后面,那么序列的第二个字母就是 A ,否则就是 B;
* 如果字母 d 在字母 c 的后面,那么 …… 不用多说了吧?直到这个字符串的结束。 这规则甚是简单,不过有个问题就是同一个 AB
* 序列,可能有多个字符串都与之相符,比方说序列“ABA”,就有“acdb”、“cadb”等等好几种可能性。说的专业一点,这一个序列实际上对应了一个字符串集合。
* 那么现在问题来了:给你一个这样的 * AB 序列,问你究竟有多少个不同的字符串能够与之相符?或者说这个序列对应的字符串集合有多大?
* 注意,只要求个数,不要求枚举所有的字符串。
*
*/
abstract class Algorithm1 {
public static BigDecimal compute(String sequenceStr) {
matrix = new BigDecimal[sequenceStr.length()][sequenceStr.length()];
return Algorithm1.calcPossible(sequenceStr, 0, 0);
}
static BigDecimal[][] matrix;// a memory matrix for fast calc;
private static BigDecimal calcPossible(String sequenceStr, int left,
int right) {
if (sequenceStr.length() == 1) {
if (sequenceStr.equalsIgnoreCase("A"))
return new BigDecimal(right + 1);
else if (sequenceStr.equalsIgnoreCase("B"))
return new BigDecimal(left + 1);
}
if (sequenceStr.substring(0, 1).equalsIgnoreCase("A")) {
if (matrix[left][right] != null)
return matrix[left][right];
BigDecimal result = new BigDecimal(0);
for (int i = 0; i <= right; i++) {
result=result.add(calcPossible(sequenceStr.substring(1), left + i + 1,
right - i));
}
matrix[left][right] = result;
return result;
} else if (sequenceStr.substring(0, 1).equalsIgnoreCase("B")) {
if (matrix[right][left] != null)
return matrix[right][left];
BigDecimal result = new BigDecimal(0);
for (int i = 0; i <= left; i++) {
result=result.add(calcPossible(sequenceStr.substring(1), left - i,
right + i + 1));
}
matrix[right][left] = result;
return result;
} else {
throw new IllegalArgumentException();
}
}
}
最后版本,7秒。
分享到:
相关推荐
3. **概率分析与随机化证明**:这是随机算法分析的关键,通过概率计算来证明算法的正确性和效率。比如,通过大数定律和中心极限定理分析算法的期望运行时间。 4. **蒙特卡洛算法与拉斯维加斯算法**:两种常见的随机...
- **特点**: 本书通过一系列的实际问题来展示如何设计高效算法,并给出具体的实现代码。 - **适用人群**: 适合所有希望提高编程技能的学习者。 - **内容覆盖**: - 数据结构优化 - 算法改进 - 性能调优等 #### 八...
### 深度解析:DeepSORT中的Re-ID模型实现与应用 #### 1. 概述 DeepSORT,即基于深度学习的SORT算法,是一种高效且精确的多目标跟踪技术,广泛应用于视频监控、自动驾驶等领域。它巧妙地结合了深度学习技术和传统...
总的来说,这个压缩包为学习和实践KNN算法提供了丰富的资源,包括理论理解、代码实现和实际应用案例,对于提升机器学习技能,尤其是Python编程和数据分析能力非常有帮助。无论是学生的大作业还是个人项目,都能从中...
加密和解密是信息安全领域中的核心概念,它们用于保护数据的隐私性和完整性。在这个主题中,我们将探讨300种不同的加密解密算法,这些...对于任何对加密解密感兴趣的个人或专业开发人员来说,这个资源都是非常宝贵的。
在UDN环境中,传统的宏基站作用逐渐被边缘化,设备间的直接通信(Device-to-Device, D2D)成为可能,这有助于降低能耗、提升网络吞吐量并提供更灵活的路由选择[2-3]。 在超密集D2D通信中,源节点与目的节点之间往往...
这可能包括机器人的运动控制、传感器技术、人工智能算法等,这些都是现代机器人技术的重要组成部分。这些技术的应用能够显著提高生产线的自动化水平,减少人工干预,降低生产成本,并提高产品质量和一致性。 自动化...
3. 推荐算法实现:项目可能包含不同推荐算法的实现,如基于用户的协同过滤、基于物品的协同过滤,甚至可能有深度学习模型如神经网络推荐模型。 4. 推荐引擎:这部分负责根据用户的历史行为和算法输出,生成个性化的...
在这个项目中,开发者可能会利用Haskell的这些特性,比如使用高阶函数如`map`或`zipWith`来处理字符串,以及利用类型系统确保输入和输出的正确性。 在`vigenere-master`这个项目文件夹中,我们可以期待找到以下内容...
这涉及到优化算法,用来预测用户对每个项目的兴趣,从而决定最终的展示顺序。 6. 大规模视频推荐系统:视频平台,如YouTube,拥有数量庞大的用户和视频内容,要高效地进行个性化推荐,需要借助先进的算法和大数据...
从描述和标签来看,这篇文章可能围绕数据挖掘和算法进行讨论,特别是对比学习方法在推荐系统中的应用。 结合部分内容,可以进一步提炼出以下知识点: 1. 对比学习模型:包括典型的对比学习模型,如SimCLR和MoCo。...
多目标跟踪是计算机视觉领域中的一个关键问题,它涉及到对多个动态对象在连续帧之间进行定位和识别。...对于感兴趣的人来说,下载提供的资源进行学习和交流,将有助于深化对多目标跟踪的理解和应用。
2. 数据结构和算法:可能包含使用列表、字典等数据结构实现的算法,如排序、搜索、过滤和映射。 3. 标准库应用:Python标准库中有很多实用模块,如os(操作系统接口)、sys(系统相关功能)、math(数学函数)、...
跨镜跟踪(Cross-Domain Tracking,也称为多目标多摄像头跟踪)是计算机视觉领域...这样的模拟环境对于研究人员和开发者来说是非常有价值的,他们可以在这个平台上验证和优化自己的跟踪算法,以适应实际应用中的挑战。
虽然在给定文件内容中没有直接提及机器学习和深度学习,但根据标题和标签,我们可以推断这篇论文所涉及的飞行机器人领域与机器学习和深度学习有紧密的联系。机器人技术的进步依赖于算法的创新,而机器学习和深度学习...
在"超声图像分割"这个主题中,我们主要关注的是如何从超声图像中准确地提取出感兴趣的结构,如胎儿、器官或病变区域。这个过程通常分为以下几个步骤: 1. **预处理**:首先,对原始图像进行去噪处理,常见的方法有...
本书适合任何对计算机视觉感兴趣的开发者或研究人员阅读,无论是初学者还是有一定经验的专业人士都能从中获益。特别是对于那些希望在Linux环境下利用Qt开发计算机视觉应用的人来说,本书将是极好的参考资料。 综上...
这包括利用统计学方法和机器学习技术来识别用户的兴趣点、话题偏好和地区偏好等。 2. **原型系统PreMiner**:基于用户偏好模型,构建了一个原型系统PreMiner。该系统支持多种应用和服务,如: - **用户移动性和...