n*n矩阵,不同行不同列选n个数 使其和最小

woaigaoxinyu 2010-05-08 10:30:28
我知道用动态规划或者最佳匹配算法可以解决,希望大家实现一下代码,函数参数就是n*n矩阵,输出是那个最小的和
...全文
2809 44 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
雪域迷影 2010-07-30
  • 打赏
  • 举报
回复
不错,学习了!
showjim 2010-06-07
  • 打赏
  • 举报
回复
showjim 2010-06-07
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 fire_woods 的回复:]
指派问题的匈牙利算法如果运气不好会迭代很多次, 而且有可能进入死循环.
一般都是做若干步后终止.
[/Quote]
配合KM的话,不会死循环,最坏n^4,可以优化到n^3
littlemonster 2010-06-06
  • 打赏
  • 举报
回复
hungarian算法可以算的,sourceforge上有源码。
amu0421 2010-06-06
  • 打赏
  • 举报
回复
我怎么感觉枚举可以啊
总共n!种可能
莫非你N相当大
[Quote=引用 3 楼 woaigaoxinyu 的回复:]
谁要是解出来了,把40分全送给您
[/Quote]
lzc52151 2010-05-31
  • 打赏
  • 举报
回复
MARK
colan0320 2010-05-30
  • 打赏
  • 举报
回复
望尘莫及!
pmars 2010-05-27
  • 打赏
  • 举报
回复
顶,明天在过来……
绿色夹克衫 2010-05-27
  • 打赏
  • 举报
回复
配合KM算法的话,就不会了,n^3之内可以求解的。

[Quote=引用 31 楼 fire_woods 的回复:]
指派问题的匈牙利算法如果运气不好会迭代很多次, 而且有可能进入死循环.
一般都是做若干步后终止.
[/Quote]
jakiejiajia 2010-05-27
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 superdullwolf 的回复:]

<SCRIPT LANGUAGE="JavaScript">

var InputArr=[[2,0,0,1],[5,0,3,1],[4,8,0,2],[1,9,7,3]];
var n=InputArr[0].length;
var min=1<<30;

//不同行不同列选n个数 使其和最小
function gogogo(x,sum,info){
if(x……
[/Quote]

我想问一下这个是如何保证不同列不同行,,望指教啊
超级大笨狼 2010-05-26
  • 打赏
  • 举报
回复
更正,求组合
<SCRIPT >
var n=5;
var m=3;
function Combine(x,y,result,info)
{
if(x==m )
{
document.write(result + "<br/>") ;
}
else
{
for(var z =y;z < n; z++)
{
if(( info & (1<<z ) )==0)
{
Combine(x+1,z ,result+z +",",info + (1<<z ));
}
}
}
}
Combine(0,0,"",0);
</SCRIPT>
jakiejiajia 2010-05-25
  • 打赏
  • 举报
回复
此等贴怎么能少了我来顶
fire_woods 2010-05-24
  • 打赏
  • 举报
回复
指派问题的匈牙利算法如果运气不好会迭代很多次, 而且有可能进入死循环.
一般都是做若干步后终止.
strwindysky 2010-05-24
  • 打赏
  • 举报
回复
进来学习一下。
fairywell 2010-05-22
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 litaoye 的回复:]

http://wiki.mbalib.com/wiki/%E5%8C%88%E7%89%99%E5%88%A9%E8%A7%A3%E6%B3%95

看看能不能访问

这个方法经常被用作解一些匹配问题,其实还有不少其他的方法,不过这方面我了解也不深。

引用 9 楼 woaigaoxinyu 的回复:

真的没找到,仁兄帮帮忙忙吧,谢啦
引用 8 楼 litaoye 的回复:
……
[/Quote]
litaoye兄的方法应该是正解吧
fairywell 2010-05-22
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 superdullwolf 的回复:]

给你解释一下这段短小,但是有点技巧的代码
gogogo(x,sum,info)
第一个参数x代表要选的列
第二个参数sum代表求和的结果
第三个参数info这里涉及到一个二进制在组合数学的应用技巧:

我们观察2的n次方,1,2,4,8,16这一系列数字,就是1<<n运算,有个规律
他们任意选择几个数字相加的数字是完全不可能相同的

比如我选了1和4=5,代表我选了只可能是1……
[/Quote]
学到一招,mark,这个的思想就是binomial factor把,很象 binomial queue
fairywell 2010-05-22
  • 打赏
  • 举报
回复
mark
0x甲鱼 2010-05-16
  • 打赏
  • 举报
回复
大笨狼很牛逼
GentooEmacs 2010-05-14
  • 打赏
  • 举报
回复
最大子矩阵和

int max_arr(int n,int*b)
{
int i,s=-10000000,sum=0;
for(i=0;i<n;++i)
{
if(s>0)s+=b[i];
else s=b[i];
if(s>sum)sum=s;
}

return sum;
}
int max_matrix(int n)
{
int i,j,k,b[200];int sum,max=-1000000 ;
for(i=0;i<n;++i)
{
memset(b,0,sizeof(b));
for(j=i;j<n;++j)
{
for(k=0;k<n;++k)
b[k]+=a[j][k];
sum=max_arr(n,b);
if(sum>max)max=sum;
}
}

return max;
}
这个是求最大子矩阵的和,求最小的话稍微改一下就OK了,原理都是一样的……
加载更多回复(24)

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧