You Are the One
题意
男孩子们上台,每人有自己的不高兴值,第 k 个等待的人不高兴值成 ( k - 1 ) * D,有一个栈可以暂时存放男孩子(让他晚上台),求最小的总不高兴值。
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
ll dp[120][120],a[120],sum[120];
int main() {
int n,t;
int num=0;
scanf("%d",&t);
while (t--){
scanf("%d",&n);
memset(dp,0, sizeof(dp));
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
sum[i]= sum[i - 1] + a[i];
}
for(int len=2;len<=n;len++){
for(int i=1;i+len<=n+1;i++){
int j=i+len-1;
//第 i 个先上台,i + 1 到 j 个都需要等一下
dp[i][j]=sum[j]-sum[i]+dp[i+1][j];
for(int k=i+1;k<=j;k++){
dp[i][j]=min(dp[i][j],a[i]*(k-i)+dp[i+1][k]+dp[k+1][j]+(sum[j]-sum[k])*(k-i+1));
}
}
}
printf("Case #%d: %lld\n",++num,dp[1][n]);
}
}