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

编程入门 行业动态 更新时间:2024-10-16 02:30:19

2020“远光杯”网络资格赛O 军训值日生(<a href=https://www.elefans.com/category/jswz/34/1766384.html style=区间dp)"/>

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]);}
}

更多推荐

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

本文发布于:2024-03-11 15:37:53,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1729294.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:值日生   区间   军训   资格赛   网络

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!