30/09/2018, 17:41

Bài toán tìm tổng lớn nhất của k phần tử liên tiếp trên mảng

Như tiêu đề anh em ai có ý tưởng về bài toán này cho mình xin với,nghĩ mãi không ra đc ý tưởng nào hợp lý.Toàn mấy ý tưởng vớ vẩn tào lao thôi.huhuhu
Cảm ơn mọi người đã đọc.

Minh Hoàng viết 19:51 ngày 30/09/2018

Gợi ý: k phần tử liên tiếp bắt đầu từ vị trí i đến i+k-1 nếu mảng có n phần tử thì có n-k+1 tập con k phần tử liên tiếp

Điệp viết 19:53 ngày 30/09/2018

tạo 1 mảng chứa toàn bộ tổng của k phần từ liên tiếp, số phần tử của mảng là n-k+1, chạy for thôi

Gió viết 19:45 ngày 30/09/2018

Tưởng tưởng có 1 khung nhìn có độ dài K

giả sử mảng ban đầu là
a[0] a[1] a[2] ... a[n]
k=3

để tính tổng k phần tử liên tiếp khung nhìn sẽ bắt đầu từ index=0

index: 0 1 2 3 4 5
lúc ban đầu  [0 1 2] 3 4 5

sau đó khung hình dịch lên 1 đơn vị:  0 [1 2 3] 4 5

Lần lượt làm như trên nhận thấy nếu tính được khung nhìn thứ i( gọi là S[i]) thì S[i+1]=S[i]-a[i-k]+a[i]

Do đó mảng chứa k phần tử liên tiếp =
S[0] =a[0]+…a[k-1]

for i=k to n do
      S[i] =S[i-1]+a[i]-a[i-k]

sau đó tính max(S[i])là dc

No Name viết 19:54 ngày 30/09/2018
#include<iostream>

using namespace std;

void NhapMang(int a[],int n)
{
	for(int i = 0; i < n; i++)
	{
		cout << "a[" << i << "] = " ;
		cin >> a[i];
	}
}
void XuatMang(int a[],int n)
{
	for(int i = 0; i < n; i++)
	{
		cout << 
			a[i] << " ";
	}
	cout << endl;
}
int TongKPhanTu(int a[],int n,int k)
{
	int i = 0;
	int S[10];
	for(int i = 0 ; i < k ; i++)
	{
		S[0] += a[i];
	}
	for(int i = 0 ; i < n - k + 1 ; i++)
	{
		
		S[i+1] = S[i] - a[i-1] + a[i+k-1];
	}
	int Max = S[0];
	for(int i = 0 ; i < n - k + 1 ; i++)
	{
		if(S[i] > Max )
			Max = S[i];
	}
	return Max;
}
int main()
{
	int a[100];
	int n;
	cout << " Nhap n : ";
	cin >> n;
	NhapMang(a,n);
	XuatMang(a,n);
	int k = 3;
	 int max = TongKPhanTu(a,n,k);
	cout << max <<endl;
	system("pause");
	return 0;

}

Mình chỉ nghĩ đc nhiu đây thôi.
Cho mình hỏi tại sao khi mình cout S[0] thì nó lại ra cái số âm linh tinh nhỉ?

Quy Le viết 19:50 ngày 30/09/2018

Ý bạn muốn tính tổng phần tử liên tiếp?
thì dùng chính cái tổng liên tiếp đó so sánh với tổng liên tiếp khác.
cái nào lớn hơn thì return nó.
mình code php sơ sơ thế này:
> function find_max_sum_element($array_input){

        // muốn liên tiếp thì phải từ 2 phần tử trở lên.
        if (count($array_input) >= 2){
            for ($i = 1, $max = $array_input[0] + $array_input[1]; $i < count($array_input); $i++){
                if ($max < $array_input[$i] + $array_input[$i+1]){
                    $max = $array_input[$i] + $array_input[$i+1];
                }
            }
          }
     return $max;
    }
Trần Hoàn viết 19:44 ngày 30/09/2018

Đào mộ à Giờ có khi chủ thớt tốt nghiệp rồi

Quy Le viết 19:46 ngày 30/09/2018

cũng tốt mà bạn, biết đâu có ai đó cũng đang cần. bạn này ra trường lại có bạn khác vào trường mà

Trần Hoàn viết 19:51 ngày 30/09/2018

Tại sao lại là PHP Trong khi ở trên có thuật toán rõ ràng rồi

rogp10 viết 19:56 ngày 30/09/2018

Với lại PHP thì cái server chạy à

Mà code cũng lạc đề

Nhàn Nguyễn viết 19:52 ngày 30/09/2018

a ơi cho e hỏi trong int main lại đặt k = 3 v a hi

HK boy viết 19:46 ngày 30/09/2018

k = 3 là ví dụ thôi bạn.

Bài liên quan
0