石子合并


#include  
using namespace std;   
int n,ans1,ans2,f1[300][300],f2[300][300];  
int sum[300],num[300];  
int main()  
{   
    scanf("%d",&n);  
    for(int i=1;i<=n+n;i++)
    {  
        scanf("%d",&num[i]);  
        num[i+n]=num[i];  
        sum[i]=sum[i-1]+num[i];  
    }  
    for(int p=1;p

计算f(i,j)的值时需要知道所有f(i,k)和f(k+1,j)的值;

而这两个中包含的元素的数量都小于f(i,j);

所以我们以len=j-i+1作为DP的阶段。

首先从小到大枚举len,然后枚举i的值,

根据len和i用公式计算出j的值,然后枚举k

查看题面

题目描述

在一个圆形操场的四周摆放 N 堆石子,现要将石子有次序地合并成一堆
规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。

试设计出一个算法,计算出将 N 堆石子合并成 1 堆的最小得分和最大得分。

输入格式

数据的第 1 行是正整数 N,表示有 N 堆石子。
第 2 行有 N 个整数,第 i 个整数 ai 表示第 i 堆石子的个数。

输出格式

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

输入 #1          输出 #1

4                43
4 5 9 4          54

说明/提示

1≤N≤100,0≤ai≤20