| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1156 人关注过本帖
标题:如何求二维数组不同行不同列元素和的最大值
只看楼主 加入收藏
VBGG
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2014-8-1
结帖率:0
收藏
已结贴  问题点数:10 回复次数:11 
如何求二维数组不同行不同列元素和的最大值
如何求M行N列二维数组不同行不同列元素和的最大值!请各位高手给出思路,能给出实现的代码更好,非常感谢!!
搜索更多相关主题的帖子: 最大值 如何 元素 
2014-08-01 16:52
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:4 
不同行不同列?那规律呢??

总得要有一个规律吧。


2维数组,在内存中排列是一个平面的排列,标记成2维数组,只是便于访问而以。
找不到最大下标等等情况,那就尝试使用一维数组来做吧。

授人于鱼,不如授人于渔
早已停用QQ了
2014-08-04 11:19
VBHHGG
Rank: 1
等 级:新手上路
帖 子:3
专家分:4
注 册:2014-8-4
收藏
得分:4 
版主您好:我是提问的VBHH,不知道怎么回事,刚注册的号进不去了,就重新注册了一个。
非常感谢您的回复,我的问题可能没说清楚,现举例如下:
假设有以下的二维数组,求其不同行且不同列元素的和的最大值。
6  4  1  2  1  3
8  4  5  2  1  6  
5  3  7  2  6  7
7  9  6  3  8  2
8  5  4  6  1  8  
6  3  2  9  7  4
经过分析,其最大值是:4+8+7+8+8+9=44
请给出解题思路或实现的代码,谢谢!
2014-08-04 13:08
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
看明白了一点。

先搜索在整个数组中搜索最大值,然后再再记录行列坐标。
在剩下的行列坐标中搜索最大值。
直到最后。这是一种方法,我没去验证。

授人于鱼,不如授人于渔
早已停用QQ了
2014-08-05 08:37
chen3523
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:33
帖 子:223
专家分:1165
注 册:2013-2-12
收藏
得分:4 
我的语文、数学都是体育老师教的。按我的理解:
第一行最大值6
第二行最大值8
第三行最大值7
第四行最大值9
第五行最大值8
第六行最大值9
按一维数组比较大小的方法进行行比较,然后记录累加。
第一次循环是行循环,第二次循环是列循环。

调试失败3次后,关机睡觉,当醒来时多有收获。
2014-08-06 08:40
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
回5楼的。
它还要考虑 列不能相同。

授人于鱼,不如授人于渔
早已停用QQ了
2014-08-06 16:57
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
代码,测试通过
程序代码:
Option Explicit

Private Type jg
    h As Long
    l As Long
    v As Long
End Type

Private Sub Command1_Click()

'定义变量
Dim fj() As String              '输入的数据分解数组
Dim dat() As Long               '中间数据,一维数组

Dim dat2() As Long              '二维数组
Dim jg() As jg                  '保存结果值

Dim hi As Long                  '多少行列,正方形
Dim s As String                 '字符串,输入和输出时用
Dim i As Long, j As Long        'j为数据总个数
Dim k As Long
Dim m As Long, n As Long
Dim o As Long, o2 As Long       '结果计数
Dim j1 As jg                    '中间结果

s = Trim(Text1.Text)            '取输入值

s = Replace(s, vbCrLf, " ")     '去掉回车

s = Trim(s)                     '使用DO来去掉多余的空格
i = 0
Do While i <> Len(s)
    i = Len(s)
    s = Replace(s, "  ", " ")
Loop

fj = Split(s, " ")              '分解

j = UBound(fj)                  '取个数
hi = Int(Sqr(j + 1))            '计算行数和列数,按正方形计算,直接开平方

ReDim dat(j)                    '重定义1维数组,用于保存原始数据
For i = 0 To j
    dat(i) = Val(fj(i))         '读原始数据
Next i

ReDim jg(1 To j + 1, 1 To hi + 1)   '结果数组
ReDim dat2(1 To hi, 1 To hi)        '每次使用的临时数组

For i = 1 To hi      '第一个元素是固定
    For k = 1 To hi
    o2 = (i - 1) * hi + k           '计算该元素应该是第几个结果
    For m = 1 To hi          '复制数组
        For n = 1 To hi
            dat2(m, n) = dat((m - 1) * hi + n - 1)
        Next n
    Next m
    
    With jg(o2, 1)                  '把结果写到第1个元素中去
        .v = dat2(i, k)
        .h = i
        .l = k
    End With

    o = 2                           '从第2个元素开始计算

    For m = 1 To hi                 '清理第一个元素使用了的行和列中的数据
        dat2(i, m) = 0
        dat2(m, k) = 0
    Next m
    
    Do                              '循环查找后面的数据开始

    j1.v = 0                        '查找剩余数据的最大值
    For m = 1 To hi
        For n = 1 To hi
            If dat2(m, n) > j1.v Then
                With j1             '找到,先不管三七二十一,保存再说
                    .v = dat2(m, n)
                    .h = m
                    .l = n
                End With
            End If
        Next n
    Next m

    jg(o2, o) = j1              '保存刚找到的数据

    For m = 1 To hi                 '照样,清理掉刚最大值对应的行列
        dat2(jg(o2, o).h, m) = 0
        dat2(m, jg(o2, o).l) = 0
    Next m
    
    o = o + 1                       '下一个元素
    Loop While o < hi + 1           '没有结束时,就继续查找
    
    For m = 1 To hi                 '计算当前行的结果
        jg(o2, hi+1).v = jg(o2, hi+1).v + jg(o2, m).v
    Next m
    
    Next k
Next i

o = 1                               '先假设第1个结果是最大的
s = ""
For i = 1 To j + 1                  '查找结果中的最大值
    If jg(o, hi+1).v < jg(i, hi+1).v Then
        o = i
    End If
    For k = 1 To hi - 1                '同时生成每行的 输出信息
        s = s & jg(i, k).v & "+"
    Next k
    s = s & jg(i, hi).v & "=" & jg(i, hi + 1).v & vbCrLf
Next i

s = s & vbCrLf & vbCrLf             '空一行
s = s & o & vbCrLf                  '输出第几个结果

    For k = 1 To hi - 1             '输出结果内容
        s = s & jg(o, k).v & "+"
    Next k
    s = s & jg(o, hi).v & "=" & jg(o, hi + 1).v & vbCrLf

Text2.Text = s                      '显示

End Sub

修改了一个代码里,应该写成 hi+1 的,却写成 7 的 元素下标。

输出的结果
6+9+9+8+7+1=40
4+9+8+8+8+7=44
1+9+9+8+8+6=41
2+9+8+8+7+7=41
1+9+9+8+8+7=42
3+9+9+8+7+1=37
8+9+9+8+7+1=42
4+9+8+8+7+3=39
5+9+9+8+7+1=39
2+9+8+7+7+3=36
1+9+9+8+7+3=37
6+9+9+8+7+1=40
5+9+9+8+5+1=37
3+9+8+8+8+1=37
7+9+9+8+8+1=42
2+9+8+8+7+1=35
6+9+9+8+8+1=41
7+9+9+8+4+1=38
7+9+8+7+4+1=36
9+9+8+8+7+1=42
6+9+8+8+6+4=41
3+8+8+7+7+4=37
8+9+8+8+7+4=44
2+9+8+7+5+1=32
8+9+9+7+6+1=40
5+9+8+8+7+3=40
4+9+9+8+7+1=38
6+9+8+7+7+3=40
1+9+9+8+7+3=37
8+9+9+8+7+1=42
6+9+8+7+2+1=33
3+8+8+8+7+2=36
2+9+8+8+6+2=35
9+9+8+8+7+1=42
7+9+8+8+7+2=41
4+9+8+7+6+1=35

2
4+9+8+8+8+7=44

看看还有更好的算法不,这是我想到的。没系统的去学过。

[ 本帖最后由 风吹过b 于 2014-8-7 17:53 编辑 ]

授人于鱼,不如授人于渔
早已停用QQ了
2014-08-06 16:58
VBHHGG
Rank: 1
等 级:新手上路
帖 子:3
专家分:4
注 册:2014-8-4
收藏
得分:0 
回复 7 楼 风吹过 b
非常感谢版主的回答,版主很强大,程序写的好复杂呀,我要好好研究一下!我听朋友说这类题目可以用KM(二分图匹配)算法来实现,不知道版主对KM算法有没有研究呀?
2014-08-07 16:17
VBHHGG
Rank: 1
等 级:新手上路
帖 子:3
专家分:4
注 册:2014-8-4
收藏
得分:0 
由于我开始提供的数据是固定的,所以一开始的读数据比较麻烦!您提供的方法是不是可以推广到随机产生的N行N列的二维数组呀?
2014-08-07 16:35
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
我没有系统的去学过 算法,对 二分图匹配 这些算法,真是不懂。
我只是穷举所有的可能,然后再到里面挑最大的那个。
----------
因为你是要求不同行列,那么要求数据必须能排成 正方形。

我读数的方法是,把一堆数据,一个数字,然后空一格,然后下一个数字,输入到 text1.text 中,不要求你必须按正方形输入。按顺序输入。
程序读到数据后,根据个数,开平方,然后计算出 是多大的二维数组,再把这些数据分到这个二维数组中。如果有数据多余分不了,就会忽略掉多余的数据。

授人于鱼,不如授人于渔
早已停用QQ了
2014-08-07 17:51
快速回复:如何求二维数组不同行不同列元素和的最大值
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031079 second(s), 9 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved