2020“远光杯”网络资格赛O 军训值日生(区间dp)

题目
每次军训课一结束,同学们都顾不得整理自己的小板凳等训练所需物品,以最快的速度冲向食堂,军训时体能消耗太大了,他们必须轻装前进,抢到自己喜欢的食物。作为军训值日生,小明的工作量非常大,他们要将自己班级中每个同学的小板凳整理好放在一起。

假设在整理前,班级中某些同学的小板凳是放在一起的,我们称放在一起的小板凳为一组小板凳,并且班级中所有小板凳是排成一排的。小明在整理自己班级小板凳的时候,会将相邻的两组小板凳整理到一起,组成一组新的板凳,所消耗的能量是两组板凳数量的乘积。

根据所给出的板凳数量及分组情况,请你帮组小明计算出整理完全班所有小板凳所消耗的最少能量。

输入要求
有多组数据(不超过5组)。
每组数据包含2行。
第一行包含一个整数n(0<n<=100),表示共有n组小板凳。
第二行包含n个整数mi(0<mi<=100),分别代表整理前每组小板凳的数量。

输出要求
每组数据输出小明整理完全班所有小板凳所消耗的最少能量。

样例输出

2
1 2
3
5 1 2

样例输出

2
17

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
const int maxn = 110;

int a[maxn],n;
ll dp[maxn][maxn];
ll sum[maxn][maxn];

int main() {
	while(~scanf("%d",&n)) {
		for(int i = 1;i <= n;++i) {
			scanf("%d",&a[i]);
			dp[i][i] = 0;
		}
		for(int i = 1;i <= n;++i) {
			sum[i][i] = a[i];
			for(int j = i+1;j <= n;++j)
				sum[i][j] = sum[i][j-1]+a[j];
		}
		for(int len = 2;len <= n;++len) {
			for(int i = 1,j;i+len-1 <= n;++i) {
				j = i+len-1;
				dp[i][j] = dp[i][i]+dp[i+1][j]+sum[i][i]*sum[i+1][j];
				for(int k = i;k < j;++k) {
					dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[i][k]*sum[k+1][j]);
				}
			}
		}
		printf("%lld\n",dp[1][n]);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值