原理参照:http://blog.163.com/functioner@126/blog/static/17283815620109304450441/
原文列举组合部分有点错误,应该为f[i,j]=min(f[i,j],f[k][j]+f[i-k][k+j]);
#include <stdio.h>
#define LEN 100
int main()
{
int s[LEN][LEN];//存储根节点值
int f[LEN][LEN];//存储最优值
int n;
int i,j,k;
scanf("%d",&n);
for(i=1;i<=n;++i)
{
scanf("%d",&s[1][i]);
f[1][i]=s[1][i];
}
for(i=1;i<n;++i)
{
s[2][i]=s[1][i]+s[1][i+1];
f[2][i]=s[2][i];
}
for(i=3;i<=n;++i)
{
for(j=1;j<=n-i+1;++j)
{
s[i][j]=s[i-1][j]+s[i-1][j+1]-s[i-2][j+1];
if(f[i-1][j]>f[i-1][j+1])
f[i][j]=f[i-1][j+1];
else
f[i][j]=f[i-1][j];
for(k=2;k<i-1;++k) //列举组合求最优解
{
if(f[i][j]>f[k][j]+f[i-k][k+j])
{
f[i][j]=f[k][j]+f[i-k][k+j];
}
}
f[i][j]+=s[i][j];
}
}
printf("*****************************\n");
for(i=1;i<=n;++i)
{
for(j=1;j<=n-i+1;j++)
{
printf("%-3d ",f[i][j]);
}
printf("\n");
}
printf("*****************************\n");
for(i=1;i<=n;++i)
{
for(j=1;j<=n-i+1;j++)
{
printf("%-3d ",s[i][j]);
}
printf("\n");
}
return 0;
}