最小代价子母树

lzusa 发布于 2019-04-13 0 次阅读


题目描述

设有一排数,共n(n<=1000),例如:22,14,7,13,26,15,11。任意两个数可以进行归并,归并的代价为该两个数的和,经过不断归并,最后归为一堆,而全部归并代价的和称为总代价,给出一种归并算法,使代价总和最小。
例如三个数,12,7 ,8,归并的过程有2种。如下图:
这里写图片描述
由此可见,第二种归并的方法总代价为最小。

输入

第一行N,第二行N个数

输出

一个数,最小归并值

#include 
#include 
using namespace std;
int r[10100],c[5100][5010],sum[10010],s[1005][1005];
int ans=0xfffffff;
int min(int x,int y)
{
  return xmain()
{
  int n;
  scanf("%d",&n);
  for (int i=1;i<=n;i++)
  {
    scanf("%d",&r[i]);  
    sum[i]=sum[i-1]+r[i];      

  }
    for (int i=1;i<=n;i++)
    {
      c[i][i]=0;
      s[i][i]=i;
    }
    for (int d=1;d<=n;d++)
      for (int i=1;i<=n-d+1;i++)
      {
        int j;
        j=i+d;
        c[i][j]=0xfffffff;
        int tmp=sum[j]-(i==0?0:sum[i-1]);
        for (int k=s[i][j-1];k<=s[i+1][j];k++)
        {
            if (c[i][j]>c[i][k]+c[k+1][j]+tmp)
            {
              c[i][j]=c[i][k]+c[k+1][j]+tmp;
              s[i][j]=k;
            }
        }
      } 

  printf("%d\n",c[1][n]);
  return 0;
}
]]>