NYoj737 石子合并(区间dp)

来源:互联网 发布:烟台鼎中网络怎么样 编辑:程序博客网 时间:2024/05/16 10:18

题意: 有N堆石子排成一排,每堆石子有一定的数量。现要将N堆石子并成为一堆。合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆。求出总的代价最小值。


解法:动态规划的思想。先求出所有区间长度为2的合并代价,然后再算出长度为3的、4的。。。。n的。复杂度是N^3,貌似楼教的一道同样问题有更快的算法,会尽快去膜拜,。,。,。


代码:

#include <iostream>#include <stdio.h>#include <cstring>using namespace std;int n;int num[210];long long sum[210];long long ans[210][210];int main(){        while(scanf("%d",&n)==1)        {        memset(ans,0,sizeof ans);        for(int i=1;i<=n;i++)            scanf("%d",num+i),sum[i]=sum[i-1]+num[i];        for(int i=1;i<n;i++)        {            for(int k=1;k+i<=n;k++)            {            long long tool=1000000000000;            for(int j=0;j<i;j++)            {                tool=min(tool,ans[k][k+j]+ans[k+j+1][i+k]);            }            ans[k][i+k]=tool+sum[i+k]-sum[k-1];//cout<<tool<<endl;            }        }        cout<<ans[1][n]<<endl;       }    return 0;}

0 0
原创粉丝点击