区间DP

来源:互联网 发布:矩阵和行列式的区别 编辑:程序博客网 时间:2024/06/06 00:46

1048 石子归并
题目描述 Description

在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。
试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得分.

输入描述 Input Description

数据的第1行试正整数N,1≤N≤100,表示有N堆石子.第2行有N个数,分别表示每堆石子的个数.

输出描述 Output Description

输出共2行,第1行为最小得分,第2行为最大得分.

样例输入 Sample Input

4
4 4 5 9

样例输出 Sample Output

43
54


/*作者:QHY题目:p1048 石子归并*/#include<iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;int s[110][110],a[110],n,sum[110],inf=0x3f3ffff;//s 两数之间最小值 int main(){cin>>n;memset(s,0x3f,sizeof(s));for(int i=1;i<=n;i++)  s[i][i]=0;for(int i=1;i<=n;i++){scanf("%d",&a[i]); sum[i]=sum[i-1]+a[i];//前缀和 }for(int len=2;len<=n;len++)//长度 for(int i=1;i<=n-len+1;i++)//起点 for(int j=i;j<i+len-1;j++){//中点 int k=i+len-1;//终点 s[i][k]=min(s[i][k],s[i][j]+s[j+1][k]+sum[k]-sum[i-1]);//cout<<"i "<<i<<" i+len-1 "<<i+len-1<<" s[i][i+len-1] "<<s[i][i+len-1]<<endl;}cout<<s[1][n];}

0 0