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ẹ.
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
=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,4PHP: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 đỡ ạ!
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
Yêu cầu và kết quả mong muốn trong File, nhờ các anh chị giúp đỡ em với ạ!
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 ạ!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 ạ!
Tôi chọn trường hợp thứ nhất mà bạn!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
Đú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?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ả?
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?
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!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