一个数据包大小是多少k_算法交流: 6046 数据包的调度机制 【2.6基本算法之动态规划】...
【題目描述】 6046 數(shù)據(jù)包的調(diào)度機制 By OIer14wa隨著 Internet的迅猛發(fā)展,多媒體技術(shù)和電子商務(wù)應用日益廣泛,Internet上的服務(wù)質(zhì)量
(QoS,Qualityof Service)問題已越來越受到重視。網(wǎng)絡(luò)中采用的數(shù)據(jù)包調(diào)度機制與網(wǎng)絡(luò)的服務(wù)質(zhì)量 QoS 有著密切的關(guān)系。研究表明傳統(tǒng)的基于隊列的調(diào)度機制已不能滿足網(wǎng)絡(luò)服務(wù)質(zhì)量QoS 的需求。服務(wù)質(zhì)量 QoS 取決于數(shù)據(jù)包的延遲。每一個數(shù)據(jù)包都有一個延遲懲罰值。由于數(shù)據(jù)包承載的數(shù)據(jù)不同,不同數(shù)據(jù)包的延遲懲罰值也可能不同。此外,數(shù)據(jù)包的延遲也和它的發(fā)送順序有關(guān)。如果一個數(shù)據(jù)包被第K個發(fā)送,假設(shè)它的延遲懲罰值是D,則這個數(shù)據(jù)包的最終延遲是 (K - 1) * D。北京大學2012 級信息學院的同學在程序設(shè)計課堂上,設(shè)計了一種新的基于棧的數(shù)據(jù)包的調(diào)度算法。同學們通過棧的先進后出(Last in First out)的原理,改變數(shù)據(jù)包的發(fā)送順序,以減小數(shù)據(jù)包的延遲總值。給定N 個等待調(diào)度的數(shù)據(jù)包,起始這N 個數(shù)據(jù)包排成一個隊列等待發(fā)送。接著,這些數(shù)據(jù)包按序進棧,調(diào)度算法可以控制數(shù)據(jù)包的出棧順序。因此通過棧,可以將后面的數(shù)據(jù)包先于前面的數(shù)據(jù)包發(fā)送出去。請你實現(xiàn)一個調(diào)度算法使N 個數(shù)據(jù)包的延遲總值最小。
輸入標準的輸入包含若干組測試數(shù)據(jù)。輸入第一行是整數(shù)T(1 <= T <= 1000),表明有T組測試數(shù)據(jù)。緊接著有T組連續(xù)的測試。每一組測試數(shù)據(jù)的第1行是 N(N <= 100),表述數(shù)據(jù)包的個數(shù)。接著的 N 行,每一行是一個整數(shù),第i 行表示數(shù)據(jù)包i的延遲懲罰值( <=50 )。輸出對于每組測試數(shù)據(jù),輸出最小的延遲總值。
樣例輸入
1
5
5
4
3
2
2
樣例輸出
24
一、題意分析
枚舉所有的可能性,利用棧來控制數(shù)據(jù)包的發(fā)送順序,來得出最小的延遲懲罰值。
二、算法說明枚舉k是最后一個出棧,根據(jù)棧這個數(shù)據(jù)結(jié)構(gòu)的特點,k如果是最后一個出棧,
k之前的一定在k之后的入棧前已經(jīng)出棧了,k之后的元素之后才入棧,出棧。
根據(jù)棧的這一特點,我們可以把區(qū)間 [i--i+j-1]枚舉第k個元素最后出棧來劃分區(qū)間,劃分為前后兩個區(qū)間
先是區(qū)間[i..k-1],然后是區(qū)間[k+1..j],最后是k。
三、數(shù)據(jù)結(jié)構(gòu)四、算法分析f[i][j]表示的是區(qū)間[i--i+j-1](j是延長的長度),最小延遲值
嘗試把一個區(qū)間作為整體來看,那么這個區(qū)間的最小懲罰值是
f[i][k-i]+a[k]*(len-1)+f[k+1][i+len-1-(k+1)+1]+(sum[i+len-1]-sum[k])*(k-i),
但是我們可以看出len是表示k(i--i+len-1枚舉序列中的元素)在當前序列中的位置,而不是整個n長序列的位置,那么*(len-1)會不會結(jié)果不對呢?而且f[i][k-i]在整體的序列中也不定是第一個,為什么不乘以他是第幾個出發(fā)的呢?
我們來看后面這個(sum[i+len-1]-sum[k])*(k-i),sum是前綴和,因為區(qū)間[k+1][i+len-1-(k+1)+1]是當前區(qū)間f[i][j]的子區(qū)間,而且他在這個區(qū)間中的是從第k-i個開始發(fā)數(shù)據(jù)包的,所以要乘以(k-i),這就可以向大區(qū)間考慮了,更新大區(qū)間的小區(qū)間表示的僅是他自身作為第一組的情況,再加上(sum[i+len-1]-sum[k])*(k-i),就可以完整的表示出這個小區(qū)間在大區(qū)間中究竟是第幾個位置了。
五、代碼與 調(diào)試
#include<stdio.h>
#include<string.h>
#define INF 1<<30
#define N 111
int a[N],f[N][N],n,t;
int sum[N];
void input()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
}
}
int min(int a,int b)
{
if(a<b)
return(a);
else
return(b);
}
void DP()
{
for(int len=2;len<=n;len++)
for(int i=1;i+len-1<=n;i++)
{
int tmp=INF;
for(int k=i;k<=i+len-1;k++)
{
tmp=min(tmp,f[i][k-i]+a[k]*(len-1)+f[k+1][i+len-1-(k+1)+1]+(sum[i+len-1]-sum[k])*(k-i));
}
f[i][len]=tmp;
}
}
int main()
{
scanf("%d",&t);
while(t--)
{
input();
DP();
printf("%dn",f[1][n]);
}
return 0;
}
總結(jié)
以上是生活随笔為你收集整理的一个数据包大小是多少k_算法交流: 6046 数据包的调度机制 【2.6基本算法之动态规划】...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 民生银行哪些信用卡有航空意外保险
- 下一篇: hbase中列簇和列_为什么不建议在hb