属于线性结构上的动态规划,区间划分类型,典型题目如最优矩阵链乘,不断分割区间直到边界
#include <iostream>
#include <cstring>
using namespace std;
//d(i,j)=min(d(i,p[x])+d(p[x],j))+j-i表示i,j之间切割的最小开销;(i,j)之间没有p[x]时结束,注意是开区间,答案是d(0,len)
int len,n,p[1001];
int d[1001][1001];
int num=0;
int dp(int x,int y)
{
int &ans=d[x][y];
if(ans)
return ans;
int i;
for(i=0;i<n;i++)
if(p[i]>x&&p[i]<y)
break;
if(i==n)
return 0; //判断边界:区间内是否有p[x]
ans=100000;
for(i=0;i<n;i++)
{
int temp=p[i];
if(p[i]>x&&p[i]<y)
ans=min(ans,dp(x,temp)+dp(temp,y)+y-x);
}
return ans;
}
int main()
{
while(cin>>len&&len)
{
cin>>n;
memset(d,0,sizeof(d));
for(int i=0;i<n;i++)
cin>>p[i];
int ans=dp(0,len);
cout<<"The minimum cutting is "<<ans<<"."<<endl;
}
return 0;
}