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

来源:互联网 发布:截图文字识别软件 编辑:程序博客网 时间:2024/05/06 07:52

题目描述

传送门

题解

只会写O(n3)的dp啊。。按理来说不科学啊,可能数据弱叭。。。
可以发现,在区间(l,r)中,如果元素k最后一个发送,那么由于是要按照顺序入栈的,一定是(l,k-1)的元素先发送,然后(k+1,r)的元素再发送,最后将k发送。那么这就变成了一个非常典型的区间dp了。

代码

#include<iostream>#include<cstring>#include<cstdio>using namespace std;#define N 105#define inf 2100000000int 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 l=1;l<=n-len+1;++l)            {                int r=l+len-1;f[l][r]=inf;                for (int k=l;k<=r;++k)                    f[l][r]=min(f[l][r],d[k]*(len-1)+f[l][k-1]+f[k+1][r]+(s[r]-s[k])*(k-l));            }        printf("%d\n",f[1][n]);    }}

总结

①性质!性质!感觉分析性质的能力还是太弱。
②往往要考虑特殊点。比如说第一个或者最后一个。

0 0