算法练习 -- DP C# 实现 全组合算法

const string splitor = "----";
void Main()
{
	var r = Dp(new List<string>(){"a","b","c","d","e","f","g"});
	Console.WriteLine(r);

	//print combosition count
	var count = 0;
	for(var i = 0 ;i < r.Count; i++){
		var c = Regex.Matches(r[i], splitor).Count;
		count += c + 1;
	}
	Console.WriteLine(string.Format("total : {0}",count));
}

//Dp[0] = "a[0],a[1],...a[n]"
//Dp[i] = Dp[i-1] cross with Dp[0]
static List<string> Dp(List<string> arr){
if(arr == null || arr.Count == 0){
return new List<string>();
}

var dpArr = new dynamic[arr.Count];

var t = string.Empty;
for(var i = 0;i < arr.Count - 1; i++){
t += arr[i] + ",";
}
t += arr[arr.Count-1];
// set dpArr[0] = "a[0],a[1],a[2]..."
dpArr[0] = t;
dpArr[0] = dpArr[0].Replace(",",splitor);
// set dpArr[1] = "a[0...n] cross a[0...n]"
dpArr[1] = cross(t,t);

//set dpArr[i...n] = dpArr[0] cross dpArr[i-1]
for(var i = 2;i< dpArr.Length ; i++){
var tmp = cross(dpArr[i-1] ,t);
dpArr[i] = tmp;
}

//twick and save result into list
var ret = new List<string>();
ret.Add(dpArr[0]);
for(var i = 1 ;i < dpArr.Length; i++){
ret.Add(string.Join(splitor.ToString(),dpArr[i]));
}
return ret;

}

//for strA = ["a,b","a,c"] and strB = "a,b,c,d"
//return ["a,b,c","a,b,d","a,c,d"]
static List<string> cross(List<string> strA, string strB){
var ret = new List<string>();
var arr = strB.Split(‘,‘);
for(var i =0 ;i< strA.Count; i++){
var str = strA[i];
for(var j = 0 ;j < arr.Length; j++){
var t = str + "," + arr[j];
if(!str.Contains(arr[j]) && !IsInclude(ret,t)){
ret.Add(t);
}
}

}

return ret;
}

//for "a,b" and "b,c,d,a"
//return ["a,b","a,c","a,d","b,c","b,d"]
static List<string> cross(string a, string b){
var arr1 = a.Split(‘,‘);
var arr2 = b.Split(‘,‘);

var r = new List<string>();

for(var i = 0;i < arr1.Length; i++){
for(var j = 0;j < arr2.Length; j++){
if(arr1[i] != arr2[j]){
var t = arr1[i] + ","+arr2[j];

if(!IsInclude(r,t)){
r.Add(t);
}

}

}
}

return r;
}
// Define other methods and classes here

static bool IsInclude(List<string> lst,string str){

for(var i = 0 ;i < lst.Count; i++){
bool containsAll = true;
if(lst[i].Length != str.Length){
containsAll = false;
}
for(var j = 0; j< str.Length; j++){
if(!lst[i].Contains(str[j])){
containsAll = false;
}
}

if(containsAll){
return true;
}

}
return false;

}

时间: 2024-10-07 04:51:00

算法练习 -- DP C# 实现 全组合算法的相关文章

算法:全组合算法

public static List<int[]> combin(final int TOTAL, final int SELETED) { List<int[]> list = new ArrayList<int[]>(400000); int[] i = new int[SELETED]; for (int x = 1; x <= SELETED; x++) i[x - 1] = x; final int LAST = SELETED - 1; while (

全组合算法

//全组合算法        public static List<List<T>> FullCombination<T>(List<T> lstSource)        {            var n = lstSource.Count;            var max = 1 << n;            var lstResult = new List<List<T>>();           

高效率的全组合算法(Java版实现)

博客上看到的一个算法,用Java实现了一个 算法描述: 算法说明:当n大于2时,n个数的全组合一共有(2^n)-1种. 当对n个元素进行全组合的时候,可以用一个n位的二进制数表示取法. 1表示在该位取,0表示不取.例如,对ABC三个元素进行全组合,  100表示取A,010表示取B,001表示取C,101表示取AC  110表示取AB,011表示取BC,111表示取ABC 注意到表示取法的二进制数其实就是从1到7的十进制数 推广到对n个元素进行全排列,取法就是从1到2^n-1的所有二进制形式 要

中文分词算法 之 基于词典的全切分算法

在使用 基于词典 的分词方法的时候,如果我们解决了下面4个问题: 1.如何把一句话中所有的词找出来呢?只要词典中有就一定要找出来. 2.如何利用1中找出来的词组合成完整的句子?组合成的句子要和原句一样. 3.如何保证2中组合而成的句子包含了所有可能的词序? 4.如何从所有可能的词序中选择最完美的一种作为最终的分词结果? 那么我们的分词方法称之为:基于词典的全切分算法. 下面我们以一个实例来说明,比如句子:中华人民共和国. 假设词典中包含如下词: 中华人民共和国 中华人民 中华 华人 人民共和国

[LeetCode] Subsets I (78) &amp; II (90) 解题思路,即全组合算法

78. Subsets Given a set of distinct integers, nums, return all possible subsets. Note: Elements in a subset must be in non-descending order. The solution set must not contain duplicate subsets. For example,If nums = [1,2,3], a solution is: [ [3], [1]

java全组合算法

public static void combination(int[] s) { if (s.length == 0) { return; } int len = s.length; int n = 1 << len; // 从1循环到2^len-1 for (int i = 1; i < n; i++) { StringBuffer sb = new StringBuffer(); // 查看第一层循环里面的任意一种取值当中的哪一位是1[比如ab,011], 如果是1,对应的字符就存

常见算法之全排列 全组合

全排列算法是一种比较常考的算法,他的做法也比较多样. 首先我们来看看最符合我们直观思考的,思路是这样的:假如没有重复元素时,传入一个数组A,并插入到另外一个数组B中,假如B中已经包含这个元素,则跳过,否则插入数组B.我们来看看具体代码: <span style="font-size:14px;">public static void permutation1(final String str, String buffer){ if (str.length() == buff

字符串排列组合算法

第二个算法是我笔试题遇到的,当时没有做出来,在网上看到别人写的算法,感觉太精妙了,就在这里分享出来. 全排列 所谓全排列,就是打印出字符串中所有字符的所有排列.例如输入字符串abc,则打印出 a.b.c 所能排列出来的所有字符串 abc.acb.bac.bca.cab 和 cba . #include<stdio.h> #include<string.h> static int number=0; void Swap(char *a ,char *b) { char temp =

获取所有组合算法、获取全排列算法(java)

转载声明:原文转自:http://www.cnblogs.com/xiezie/p/5574516.html 受到ACM1015的影响,个人感觉,有必要对统计学上的 全组合和全排列 进行一个简单的总结 组合数:从m个不同元素中取出n(n≤m)个元素的所有组合的个数,叫做从m个不同元素中取出n个元素的组合数(Combination). 如1,2,3三个元素的全组合为: 1 2 3 12 13 23 123 以下是java实现的获取全组合及其个数的算法: import java.io.Buffere