Tìm dãy con có các phần tử tăng dần và có độ dài lớn nhất trong dãy mẹ (2 người xem)

  • Thread starter Thread starter nnd1988
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

nnd1988

Thành viên chính thức
Tham gia
10/3/14
Bài viết
68
Được thích
15
Nghề nghiệp
Nhân viên Văn Phòng
Yêu cầu và kết quả mong muốn trong File, nhờ các anh chị giúp đỡ em với ạ!
 

File đính kèm

Em xin giải thích thêm 1 chút ạ:
Trong File giả lập em có dãy con gồm 10 phần tử là:5, 6, 4, 1,2,3,4,5,3,4
có 3 dãy con thỏa mãn có các phần tử tăng dần là:(5,6)- Độ dài là 2 và (1,2,3,4,5) - Độ dài là 5 và (3,4) - Độ dài là 2 nhưng chỉ có dãy con:1,2,3,4,5 là thỏa mãn yêu cầu vì nó có độ dài là 5. Vị trí phần tử đầu tiên của dãy con là vị trí thứ 4 trong dãy mẹ.
 
Lần chỉnh sửa cuối:
Upvote 0
Em xin giải thích thêm 1 chút ạ:
Trong File giả lập em có dãy con gồm 10 phần tử là:5, 6, 4, 1,2,3,4,5,3,4
có 3 dãy con thỏa mãn có các phần tử tăng dần là:(5,6)- Độ dài là 2 và (1,2,3,4,5) - Độ dài là 5 và (3,4) - Độ dài là 2 nhưng chỉ có dãy con:1,2,3,4,5 là thỏa mãn yêu cầu vì nó có độ dài là 5. Vị trí phần tử đầu tiên của dãy con là vị trí thứ 4 trong dãy mẹ.

PHP:
Public Function MeCon(Rng As Range) As String
Dim Arr(), Tem1 As Long, Tem2 As Long, Num As Long, J As Long, Str As String
Arr = Rng.Value
Tem1 = 1: Tem2 = 1: Num = 1: Str = Arr(1, 1)
For J = 2 To UBound(Arr, 2)
    If Arr(1, J) = Arr(1, J - 1) + 1 Then
        Num = Num + 1
        Str = Str & ";" & Arr(1, J)
        If Num > Tem2 Then MeCon = Tem1 & " # " & Num & " # (" & Str & ")"
    Else
        Tem1 = J
        Tem2 = Num
        Num = 1
        Str = Arr(1, J)
    End If
Next J
End Function

Nhập công thức vào ô nào đó:
PHP:
 =MeCon(B2:K2)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
PHP:
Public Function MeCon(Rng As Range) As String
Dim Arr(), Tem1 As Long, Tem2 As Long, Num As Long, J As Long, Str As String
Arr = Rng.Value
Tem1 = 1: Tem2 = 1: Num = 1: Str = Arr(1, 1)
For J = 2 To UBound(Arr, 2)
    If Arr(1, J) = Arr(1, J - 1) + 1 Then
        Num = Num + 1
        Str = Str & ";" & Arr(1, J)
        If Num > Tem2 Then MeCon = Tem1 & " # " & Num & " # (" & Str & ")"
    Else
        Tem1 = J
        Tem2 = Num
        Num = 1
        Str = Arr(1, J)
    End If
Next J
End Function

Nhập công thức vào ô nào đó:
PHP:
 =MeCon(B2:K2)
Cảm ơn bạn Batê. Hàm này với trường hợp cụ thể của mình thì đúng rồi tuy nhiên do ví dụ mẫu của mình đặc biệt quá nên có thể bạn hiểu sai vấn đề ạ. Dãy con ở đây có các phần tử tăng chứ không nhất thiết là tăng liên tiếp ạ. Ví dụ dãy mẹ là: 5,1,3,6,7,2,3,0,9,13,4
thì có 3 dãy con là: (1,3,6,7) và (2,3) và (0,9,13) và dãy con thỏa mãn điều kiện là: (1,3,6,7) ạ! Mong bạn và các thành viên khác giúp đỡ ạ!
 
Upvote 0
Cảm ơn bạn BaTe mình đã sửa code của bạn và đã thành công rồi.
Mình sửa If Arr(1, J) = Arr(1, J - 1)+1 Then thành If Arr(1, J) > Arr(1, J - 1) Then
 
Upvote 0
Cảm ơn bạn Batê. Hàm này với trường hợp cụ thể của mình thì đúng rồi tuy nhiên do ví dụ mẫu của mình đặc biệt quá nên có thể bạn hiểu sai vấn đề ạ. Dãy con ở đây có các phần tử tăng chứ không nhất thiết là tăng liên tiếp ạ. Ví dụ dãy mẹ là: 5,1,3,6,7,2,3,0,9,13,4
thì có 3 dãy con là: (1,3,6,7) và (2,3) và (0,9,13) và dãy con thỏa mãn điều kiện là: (1,3,6,7) ạ! Mong bạn và các thành viên khác giúp đỡ ạ!

Diễn giải và ví dụ không tổng quát gì cả.
Thay bằng cái này thử xem
PHP:
Public Function MeCon(Rng As Range) As String
Dim Arr(), Tem1 As Long, Tem2 As Long, Num As Long, J As Long, Str As String
Arr = Rng.Value
Tem1 = 1: Tem2 = 1: Num = 1: Str = Arr(1, 1)
For J = 2 To UBound(Arr, 2)
    If Arr(1, J) > Arr(1, J - 1) Then
        Num = Num + 1
        Str = Str & ";" & Arr(1, J)
        If Num > Tem2 Then
            MeCon = Tem1 & " # " & Num & " (" & Str & ")"
            Tem2 = Num
        End If
    Else
        Tem1 = J
        Num = 1
        Str = Arr(1, J)
    End If
Next J
End Function
 
Upvote 0
Yêu cầu và kết quả mong muốn trong File, nhờ các anh chị giúp đỡ em với ạ!

rảnh rối viết đoạn code góp vui....đúng với kết quả trong bài, ko biết có đúng trong mọi trường hợp ko..........hihihihi
Mã:
Sub dzocChoi()
Dim arr As Variant, i, j, k, lc As Long
arr = Range([b2], [k2]).Value

For k = 1 To UBound(arr, 2)
    If j < arr(1, k) Then
        i = i + 1
        If i = 4 Then lc = k - 4: Exit For
    Else
        i = 0
    End If
    j = arr(1, k)
Next
If lc Then
    MsgBox " chuoi bat dau vi tri so " & lc
Else
    MsgBox " khong tim thay chuoi"
End If
End Sub
 
Upvote 0
rảnh rối viết đoạn code góp vui....đúng với kết quả trong bài, ko biết có đúng trong mọi trường hợp ko..........hihihihi
Mã:
Sub dzocChoi()
Dim arr As Variant, i, j, k, lc As Long
arr = Range([b2], [k2]).Value

For k = 1 To UBound(arr, 2)
    If j < arr(1, k) Then
        i = i + 1
        If i = 4 Then lc = k - 4: Exit For
    Else
        i = 0
    End If
    j = arr(1, k)
Next
If lc Then
    MsgBox " chuoi bat dau vi tri so " & lc
Else
    MsgBox " khong tim thay chuoi"
End If
End Sub
Bài này trong trường hợp này chỉ tìm được vị trí bắt đầu chưa tim được độ dài. Với các trường hợp khác thì sai luôn anh ạ!
 
Upvote 0
Bài này trong trường hợp này chỉ tìm được vị trí bắt đầu chưa tim được độ dài. Với các trường hợp khác thì sai luôn anh ạ!

ủa chứ không phải ở trên ổng nói độ dài mặc nhiện là 5 hả?
vậy là hỏng trúng hả........heheheh. thôi vậy đi ngủ....kakak
 
Upvote 0
Bài này điều kiện không đầy đủ. Muốn giải it nhất phải qua 3-4 lượt "nhưng mà..."
Người hỏi bài hoàn toàn thiếu kinh nghiệm về phân tích dữ liệu.

1. Định nghĩa thế nào là "tăng dần"? có nghĩa là X(n+1) > X(n) hay là X(n+1) = X(n) + 1. Trong ví dụ, tác giả dùng trường hợp thứ hai: X(n+1) = X(n) + 1

2. Từ "nhất" chỉ có nghĩa là đứng đầu. Trong một tập hợp, phải bao quát trường hợp "đồng hạng nhất". Nếu có nhiều hơn một dãy con hội đủ diều kiện để đứng nhất thì làm thế nào? chỉ chọn cái đầu tiên hay chọn tất cả?
 
Upvote 0
1. Định nghĩa thế nào là "tăng dần"? có nghĩa là X(n+1) > X(n) hay là X(n+1) = X(n) + 1. Trong ví dụ, tác giả dùng trường hợp thứ hai: X(n+1) = X(n) + 1
Tôi chọn trường hợp thứ nhất mà bạn!
2. Từ "nhất" chỉ có nghĩa là đứng đầu. Trong một tập hợp, phải bao quát trường hợp "đồng hạng nhất". Nếu có nhiều hơn một dãy con hội đủ diều kiện để đứng nhất thì làm thế nào? chỉ chọn cái đầu tiên hay chọn tất cả?
Đúng là trường hợp này tôi chưa lường trước được! Bạn có thể chỉ giúp mình thuật toán giải quyết trường hợp có hơn 1 dãy con cùng thỏa mãn điều kiện được không?
 
Upvote 0
Tôi chọn trường hợp thứ nhất mà bạn!

Đúng là trường hợp này tôi chưa lường trước được! Bạn có thể chỉ giúp mình thuật toán giải quyết trường hợp có hơn 1 dãy con cùng thỏa mãn điều kiện được không?

hỏng trúng nữa thì đi ngủ nữa à nghen............hehehhehe
Mã:
Sub dzocChoi()
Dim arr As Variant, j, k, l, s_pos, pos As Long, kq()
arr = Range([b2], [b2].End(2)).Value
s_pos = 1
For k = 1 To UBound(arr, 2)
    If j < arr(1, k) Then
        If k - s_pos > l Then
            pos = s_pos
            l = k - s_pos
            If IsArray(kq) Then Erase kq
            i = 1
            ReDim Preserve kq(1 To i)
            kq(1) = " chuoi bat dau vi tri so " & pos & " dai " & l + 1
        ElseIf k - s_pos = l Then
            pos = s_pos
            l = k - s_pos
            i = i + 1
            ReDim Preserve kq(1 To i)
            kq(i) = " chuoi bat dau vi tri so " & pos & " dai " & l + 1
        End If
        
    Else
        s_pos = k
    End If
    j = arr(1, k)
Next
If IsArray(kq) Then MsgBox Join(kq, Chr(10))
End Sub
 
Upvote 0
hỏng trúng nữa thì đi ngủ nữa à nghen............hehehhehe
Mã:
Sub dzocChoi()
Dim arr As Variant, j, k, l, s_pos, pos As Long, kq()
arr = Range([b2], [b2].End(2)).Value
s_pos = 1
For k = 1 To UBound(arr, 2)
    If j < arr(1, k) Then
        If k - s_pos > l Then
            pos = s_pos
            l = k - s_pos
            If IsArray(kq) Then Erase kq
            i = 1
            ReDim Preserve kq(1 To i)
            kq(1) = " chuoi bat dau vi tri so " & pos & " dai " & l + 1
        ElseIf k - s_pos = l Then
            pos = s_pos
            l = k - s_pos
            i = i + 1
            ReDim Preserve kq(1 To i)
            kq(i) = " chuoi bat dau vi tri so " & pos & " dai " & l + 1
        End If
        
    Else
        s_pos = k
    End If
    j = arr(1, k)
Next
If IsArray(kq) Then MsgBox Join(kq, Chr(10))
End Sub
Code quá ổn luôn bạn ơi. Đúng trong mọi trường hợp luôn và nó lấy hết được các chuỗi con cùng thỏa mãn. Cảm ơn bạn nhiều nhiều!)(&&@@)(&&@@)(&&@@
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom