题目描述
也是比较简单的dp
设f(l,r)为切l~r段的最小花费.
f(l,r)=min(f(l,k)+f(k,r))+r−l(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;
}