6046:数据包的调度机制 题解

总时间限制: 
1000ms 
内存限制: 
65536kB
描述

随着 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


【题解】区间一般操作,第一层枚举区间长度,第二层枚举起点

#include
#include
inline int min(int a,int b) {
	return a>b?b:a;
}
#define inf 0x3f3f3f3f
int main() {
	int T;
	scanf("%d",&T);
	while(T--) {
		int n,s[110]= {0},a[110],d[110][110]= {0};
		scanf("%d",&n);
		for(int i=1; i<=n; i++) {
			scanf("%d",&a[i]);
			s[i]=s[i-1]+a[i];
		}
		for(int len=1; len<=n; len++)
			for(int i=1; i<=n-len+1; i++) {
				int j=i+len-1;
				d[i][j]=inf;
				for(int k=i; k<=j; k++)
					d[i][j]=min(d[i][j],a[k]*(len-1)+d[i][k-1]+d[k+1][j]+(s[j]-s[k])*(k-i));
			}
		printf("%d\n",d[1][n]);
	}
	return 0;
}


你可能感兴趣的:(★来源,★基础,------【2.6动态规划】)