UVA Problem 10003 Cutting Sticks (切割木棍)

来源:互联网 发布:.co.jp 日本域名 编辑:程序博客网 时间:2024/09/21 09:24

题目链接 :https://cn.vjudge.net/problem/UVA-10003

 【题解】 这是一道很经典的动态规划题,出现了很多次,今天终于把它弄明白了,

 参考博客:http://http://blog.csdn.net/metaphysis/article/details/6872560


 【AC代码】

#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>using namespace std;const int N=55;#define INF 0x3f3f3f3fint length,num,a[N];int dp[1005][1005];int cust(int start,int end){    if(dp[start][end]<INF)        return dp[start][end];//这说明已经有了最小花费  直接返回即可    for(int i=(start+1);i<=(end-1);i++)//注意不是从0到end    {        int ss = cust(start,i)+cust(i,end);//递归的去求最小花费        ss += (a[end]-a[start]) ;        if(ss < dp[start][end])            dp[start][end]=ss ;    }    return dp[start][end];}int main(){    while(~scanf("%d",&length),length)    {        scanf("%d",&num);        for(int i=1;i<=num;i++)            scanf("%d",&a[i]);        }        a[num+1]= length;//末端长度为整个木棒长        int money=0;        if(num)        {            for(int i=0;i<=55;i++)                for(int j=0;j<55;j++)                dp[i][j]=INF;//初始化花费无穷大            for(int i=0;i<=num;i++)                dp[i][i+1]=0;//相邻的结点不用切割            cust(0,num+1);//加入两个端点            money = dp[0][num+1];//整个长度的min花费        }        printf("The minimum cutting is %d.\n",money);    }    return 0;}


原创粉丝点击