uva 10003 Cutting Sticks 【区间dp】

来源:互联网 发布:医疗大数据分析 编辑:程序博客网 时间:2024/04/29 17:19

题目:uva 10003 Cutting Sticks


题意:给出一根长度 l 的木棍,要截断从某些点,然后截断的花费是当前木棍的长度,求总的最小花费?


分析:典型的区间dp,其实和石子归并是一样的,花费就是石子的和,那么久不用多说了。


AC代码:

#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include <map>#include <cmath>#include <vector>#include <algorithm>using namespace std;const int inf = 0x3f3f3f3f;const int N = 65;int a[N];int dp[N][N];int main(){    int chang,n,x;    while(~scanf("%d",&chang) && chang)    {        memset(dp,0x3f3f3f3f,sizeof(dp));        scanf("%d",&n);        a[0]=0,a[n+1]=chang;        for(int i=1;i<=n;i++){            scanf("%d",&a[i]);        }        n+=2;        for(int i=0;i<=n;i++)            dp[i][i+1]=0;        for(int len=2;len<=n;len++)        {            for(int l=0;(l+len)<n;l++)            {                int r=l+len;                for(int i=l+1;i<r;i++)                    dp[l][r]=min(dp[l][r],dp[l][i]+dp[i][r]+(a[r]-a[l]));                //printf("xx%d %d %d\n",l,r,dp[l][r]);            }        }        printf("The minimum cutting is %d.\n",dp[0][n-1]);    }    return 0;}


0 0