【区间DP】CodeVS 1048 石子归并 [n立方做法]

版权声明:转载无所谓的。。。 https://blog.csdn.net/xuxiayang/article/details/82051782

前言

填坑。。。


链接

http://codevs.cn/problem/1048/


大意

给定一堆石子,每次可以选择相邻的石子合并成一大堆石子,花费的代价是它们的代价和,问合并成一堆的最小代价。。。


思路

区间 d p

n 3 做法直接动态规划,方程

f [ i , j ] = m i n { f [ i , j ] , f [ i , k ] + f [ k + 1 , j ] + w e i g h t ( i , j ) } ( i k < j )

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;int x,s[101],n,f[101][101];
signed main()
{
    memset(f,127/3,sizeof(f));
    scanf("%d",&n);
    for(register int i=1;i<=n;i++) scanf("%d",&x),s[i]=s[~-i]+x,f[i][i]=0;//预处理前缀和
    for(register int i=n-1;i>0;i--)
     for(register int j=i+1;j<=n;j++)
      for(register int k=i;k<j;k++)
       f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+s[j]-s[~-i]);//动态规划
    printf("%d",f[1][n]);
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/82051782