UVa10003 Cutting Sticks

来源:互联网 发布:自动骂人软件 编辑:程序博客网 时间:2024/05/20 14:15

题目描述
这里写图片描述


也是比较简单的dp
f(l,r)为切l~r段的最小花费.
f(l,r)=min(f(l,k)+f(k,r))+rl(l<k<r) 其中k为可切的点。
边界是f(l,r)=0([l,r])
答案是f(0,L)
状态有O(L2)个,决策有O(n)
时间复杂度O(L2n)
我觉得用记忆化搜索较好。
代码

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<cstdlib>using namespace std;int f[1010][1010],c[60],n,l;const int INF=100000000;int dp(int l,int r){    int& ans=f[l][r];    if(ans>-1) return ans;    ans=INF;    for(int i=0;i<n;i++) if(c[i]>l&&c[i]<r) ans=min(ans,dp(l,c[i])+dp(c[i],r)+r-l);    return ans==INF?ans=0:ans;}int main(){    while(cin>>l&&l){        cin>>n;        memset(f,-1,sizeof(f));        for(int i=0;i<n;i++) scanf("%d",&c[i]);        printf("The minimum cutting is %d.\n",dp(0,l));    }    return 0;}
原创粉丝点击