题目描述
题解
只会写
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 2100000000
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 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]);
}
}
总结
①性质!性质!感觉分析性质的能力还是太弱。
②往往要考虑特殊点。比如说第一个或者最后一个。