(ssl 2863)石子合并

来源:互联网 发布:淘宝宝贝视频怎么上传 编辑:程序博客网 时间:2024/06/06 00:22

Description

在一个操场上一排地摆放着N堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。请设计一个程序,计算出将N堆石子合并成一堆的最小得分。

分析:按照一般人的思想(贪心),但是是错误的。新学了一种动态规划(区间型动态规划)

  • #include <cstdio>#include <algorithm>#include <cstring>using namespace std;int f[101][101],s[101],n,x;int main(){scanf("%d",&n);for (int i=1;i<=n;i++)scanf("%d",&x),s[i]=s[i-1]+x; //s前缀和memset(f,127/3,sizeof(f)); //赋值给f一个很大的数(不过相加不会爆)for (int i=1;i<=n;i++) f[i][i]=0; //边界for (int i=n-1;i>=1;i--) //两个两个for (int j=i+1;j<=n;j++)for (int k=i;k<=j-1;k++) //在i和j中间找到一个中间点。f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+s[j]-s[i-1]);//最小值printf("%d",f[1][n]); return 0;}