6046 資料報的排程機制 區間dp

2022-08-15 05:57:22 字數 2059 閱讀 9046

題目鏈結

描述隨著 internet的迅猛發展,多**技術和電子商務應用日益廣泛,internet上的服務質量

(qos,qualityof service)問題已越來越受到重視。網路中採用的資料報排程機制與網路的服務質量 qos 有著密切的關係。研究表明傳統的基於佇列的排程機制已不能滿足網路服務質量qos 的需求。服務質量 qos 取決於資料報的延遲。每乙個資料報都有乙個延遲懲罰值。由於資料報承載的資料不同,不同資料報的延遲懲罰值也可能不同。此外,資料報的延遲也和它的傳送順序有關。如果乙個資料報被第k個傳送,假設它的延遲懲罰值是d,則這個資料報的最終延遲是 (k - 1) * d。北京大學2012 級資訊學院的同學在程式設計課堂上,設計了一種新的基於棧的資料報的排程演算法。同學們通過棧的先進後出(last in first out)的原理,改變資料報的傳送順序,以減小資料報的延遲總值。給定n 個等待排程的資料報,起始這n 個資料報排成乙個佇列等待傳送。接著,這些資料報按序進棧,排程演算法可以控制資料報的出棧順序。因此通過棧,可以將後面的資料報先於前面的資料報傳送出去。請你實現乙個排程演算法使n 個資料報的延遲總值最小。

輸入標準的輸入包含若干組測試資料。輸入第一行是整數t(1 <= t <= 1000),表明有t組測試資料。緊接著有t組連續的測試。每一組測試資料的第1行是 n(n <= 100),表述資料報的個數。接著的 n 行,每一行是乙個整數,第i 行表示資料報i的延遲懲罰值( <=50 )。

輸出對於每組測試資料,輸出最小的延遲總值。

樣例輸入

155

4322

樣例輸出

24
檢視#

結果時間

3accepted

08-18

2wrong answer

08-18

1wrong answer

06-12

這道題目積壓的時間挺長的。第一眼看這道題目我是懵逼的。我嘗試了貪心的做法,發現是錯的。因為這裡有棧的存在,所以資料報不可能以任意順序出棧。之後便在網上查詢各種資料。這是乙個區間動態規劃問題。這個名稱很高大上。。我看了很久才看明白這是怎麼一回事。

考慮棧的操作特點是先進後出。此題中的資料報排成佇列依次進棧。最後乙個出棧的資料報是關鍵,它將整個過程分為兩段,它之前的資料報和它之後的資料報。因此可以猜測子問題如何分解。直接上狀態轉移方程:

dp[ i ][ j ]表示第 i 個資料報到第 j 個資料報的最小延遲

dp[ i ][ j ]=min(dp[ i ][ j ],

dp[ i ][ k-1 ]+dp[ k+1 ][ j ]+penalt[ k ]* ( l-1 )+(sum[ j ]-sum[ k ])*(k-i));( i<=k<=j )

第k個資料報最後出棧

dp[ i ][ k-1 ]表示之前的資料報的最小延遲

dp[ k+1 ][ j ]表示之後資料報的最小延遲

penalt[ k ]* ( l-1 )第k個資料報的最小延遲

(sum[ j ]-sum[ k ])*(k-i))後半段的資料報由於是在前半段資料報之後傳送所以他們的傳送次序是從k-i+1開始的,所以加上這個差值。

列舉的時候先列舉區間的長度,然後列舉區間的起點,因為當前的區間總是依賴更短的區間進行更新。這樣列舉滿足由已知推未知

#include#include

#include

#include

#include

#include

#include

#define debug(x) cout<<#x<<" = "namespace

std;

const

int maxn=1e2+10

;const

int inf=0x3f3f3f3f

;int

t,n;

intpenalt[maxn];

intsum[maxn];

intdp[maxn][maxn];

intmain()

for(int l=1;l<=n ;l++)}}

printf(

"%d\n

",dp[1

][n]);

}}

學習資料

golang的goroutine排程機制

感覺豁然開朗,受益匪淺 去繁就簡,再加上自己的一些理解,整理了一下 排程器 主要基於三個基本物件上,g,m,p 定義在原始碼的src runtime runtime.h檔案中 1.g代表乙個goroutine物件,每次go呼叫的時候,都會建立乙個g物件 2.m代表乙個執行緒,每次建立乙個m的時候,都...

golang的goroutine排程機制

文章出處 主要基於三個基本物件上,g,m,p 定義在原始碼的src runtime runtime.h檔案中 1.g代表乙個goroutine物件,每次go呼叫的時候,都會建立乙個g物件 2.m代表乙個執行緒,每次建立乙個m的時候,都會有乙個底層執行緒建立 所有的g任務,最終還是在m上執行 3.p代...

從Linux的程序排程機制中想到的

linux 持續維護相關的資料結構 諸如 runqueue prio array 不斷更新程序的動態優先順序,並相應的調整時間片,從而實現了 o 1 複雜度的程序排程演算法,可以在常量時間內排程新程序上台執行,而不受系統中程序總數的影響。我覺得這至少能佐證三個道理 1 效益可以來自於平時點點滴滴地積...