Có‌ ‌N‌ ‌đống‌ ‌sỏi‌ ‌được‌ ‌xếp‌ ‌thành‌ ‌một‌ ‌hàng,‌ ‌đống‌ ‌thứ‌ ‌i‌ ‌có‌ ‌a‌i‌ ‌viên‌ ‌sỏi.‌ ‌Người‌ ‌ta‌ ‌có‌ ‌thể‌ ‌ghép‌ ‌ hai‌ ‌đống‌ ‌sỏi‌ ‌kề‌ ‌nhau‌ ‌thành‌ ‌một‌ ‌đống‌ ‌và‌ ‌mất‌ ‌một‌ ‌chi‌ ‌phí‌ ‌thời‌ ‌gian‌ ‌có‌ ‌giá‌ ‌trị‌ ‌bằng‌ ‌tổng‌ ‌số‌ ‌viên‌ ‌ sỏi‌ ‌của‌ ‌hai‌ ‌đống‌ ‌sỏi‌ ‌đó‌ ‌(‌để‌ ‌ghép‌ ‌đống‌ ‌sỏi‌ ‌thứ‌ ‌i‌ ‌thì‌ ‌mất‌ ‌a‌i‌‌ ‌đơn‌ ‌vị‌ ‌thời‌ ‌gian‌).‌ ‌ Yêu‌ ‌cầu:‌ ‌Hãy‌ ‌viết‌ ‌chương‌ ‌trình‌ ‌để‌ ‌ghép‌ ‌N‌ ‌đống‌ ‌sỏi‌ ‌trên‌ ‌thành‌ ‌một‌ ‌đống‌ ‌sao‌ ‌cho‌ ‌tổng‌ ‌ thời‌ ‌gian‌ ‌là‌ ‌lớn‌ ‌nhất text ghepsoi.inp 4 5 2 8 3 ghepsoi.out 43 giải thích bước 1: ghép 2 với 8 được 10 bước 2: ghép kết quả ở bước 1 là 10 với 5 được 15 bước 3: ghép kết quả ở bước 2 là 15 với 3 là 18 tổng thời gian ghép sỏi là 10+15+18=43 Cần thuật toán quy hoạch động của bài này xin thỉnh giáo cao nhân

1 câu trả lời

var i,n:longint;
    a:array[0..1000007] of longint;
function f(i:longint):longint;

begin
        if i = 1 then f := a[1]
        else if i = 2 then f := a[1]+a[2]
        else if i = 3 then f := max(max(a[1]+a[2],a[2]+a[3]),a[1]+a[3])
        else f := max( max( f(i-1),f(i-2)+a[i] ), f(i-3)+a[i-1]+a[i] );
end;

begin
        assign(input,'thuong.inp');reset(input);
        assign(output,'thuong.out');rewrite(output);
        readln(n);
        for i:=1 to n do read(a[i]);
        writeln(f(n));
end.

Câu hỏi trong lớp Xem thêm