[openjudge] 数据包的调度机制(dp好题)

来源:互联网 发布:清除注册表的软件 编辑:程序博客网 时间:2024/05/26 02:55
描述

随着 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 )。
输出
对于每组测试数据,输出最小的延迟总值。
样例输入
1554322
样例输出
24


分析:在区间(i , j)中,如果元素k最后一个发送,那么由于是要按照顺序入栈的,一定是[ l , k )的元素先发送,然后( k , r ]的元素再发送,最后将k发送。
f[i][j]表示区间(i,j)的在原队列中相对最小延迟值


#include<iostream>#include<cstring>#include<cstdio>using namespace std;#define N 105const int inf=1<<30;int T,n;int d[N],s[N],f[N][N];int main(){    scanf("%d",&T);     while (T--)    {        scanf("%d",&n);        for (int i=1;i<=n;++i) scanf("%d",&d[i]);        for (int i=1;i<=n;++i) s[i]=s[i-1]+d[i];//前缀和预处理        memset(f,0,sizeof(f));        for (int len=2;len<=n;len++)            for (int i=1;i<=n-len+1;i++)            {                int j=l+len-1;f[i][j]=inf;//!!!atention                for (int k=i;k<=j;k++)                    f[i][j]=min(f[i][j],d[k]*(len-1)+f[l][k-1]+f[k+1][r]+(s[r]-s[k])*(k-l));//s[r]-s[k]是第二段(k,r]对于k的延迟值偏移量            }        printf("%d\n",f[1][n]);    }}


0 0
原创粉丝点击