首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

求教一个数学有关问题

2012-02-21 
求教一个数学问题一个200200的矩阵,每个单元只有0和1两种情况。现在给出:1.每一行1的个数2.每一列1的个数3.

求教一个数学问题
一个200×200的矩阵,每个单元只有0和1两种情况。

现在给出:
1.每一行1的个数
2.每一列1的个数
3.每条斜线(与对角线平行的线)上的1的个数。


有什么算法(除穷举法之外)可以还原这个矩阵?

能回答者要我付钱也可以!拜托!!!

[解决办法]
解方程是很简单,比如n^2个变量,消去大概6n个变量,余下n^2-6n个变量,但是不是说余下n^2-6n个变量随便选择就可以是合法的解,这个是因为我们要求每个变量都是0或1(包含被消去的变量)。
而对于这n^2-6n个变量,如果你继续采用试探的方法,那么还是有2^(n^2-6n)种不同可能,所以复杂度还是太高,这种方法意义不大。
这儿问题主要问题还在于问题本身复杂度很高,如果情况不是很特殊,估计解的数目会非常之多。
另外这个问题应该属于0-1规划问题
[解决办法]
一个根据概率猜测做贪心算法

C# code
//在基本快速排序里有个试验,在有大量重复元素时,进行划分出中值,这个是一个合理的方案,//就这个思路加入剔除和中值相等的元素操作.void _sort_kn_2(pVT pDest,SIZE_T n){    if(n < 2)        return ;    if(n < 32){        _insert_sort(pDest,n);        return ;    }    SIZE_T i = __divide_min(pDest,n,find_rand(pDest,n));    _sort_kn_2(pDest,i);    n -= i;            pDest += i;    if(n < 2)        return ;    if(n < 32){        _insert_sort(pDest,n);        return ;    }    i = find_rand(pDest,n);    if(*pDest == *(pDest + i))//如果第二次随机值仍然相同,由于是随机值,两次都相同因此大致考虑为和中值相等的值较多,可以考虑剔除相等的.//如果不同,则看成是对这部分进行了一次划分.//这里可以注意的,这里随机选值包含了上一次划分剩下的那个中值.//如果比较相等比较多花销,可以考虑把那个剔除,但程序稍微复杂点.        i = __divide_equal(pDest,n,0);    else{        i = __divide_min(pDest,n,i);        _sort_kn_2(pDest,i);    }    _sort_kn_2(pDest + i + 1,n - i - 1);}void sort_kn_2(pVT pBeg,pVT pEnd){    if(pBeg + 1 < pEnd)        _sort_kn_2(pBeg,pEnd - pBeg);}//晚上考虑递归深度问题. 

热点排行