实际上两种写法都差不多......
dp写法:
#include<bits/stdc++.h>
#define mem(a,b) memset((a),b,sizeof(a))
const int inf=1e9+10;
typedef long long ll;
const int N=100010;
using namespace std;
int l,n;
int ans[60][60];
int a[60];
int main()
{
while(scanf("%d",&l)!=EOF)
{
if(l==0)
return 0;
scanf("%d",&n);
mem(ans,0);
mem(a,0);
a[0]=0;
a[n+1]=l;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=0;i<=n+1;i++)
for(int j=0;j<=n+1;j++)
ans[i][j]=inf;
for(int i=0;i<=n+1;i++)
{ans[i][i]=0;ans[i][i+1]=0;ans[i][i+2]=a[i+2]-a[i];}
for(int i=n;i>=0;i--)
{
for(int j=i+2;j<=n+1;j++)
{
for(int k=i+1;k<j;k++)
ans[i][j]=min(ans[i][j],ans[i][k]+ans[k][j]+a[j]-a[i]);
}
}
printf("The minimum cutting is %d.\n",ans[0][n+1]);
}
return 0;
}
DFS写法:
#include<bits/stdc++.h>
#define mem(a,b) memset((a),b,sizeof(a))
const int inf=1e9+10;
typedef long long ll;
const int N=100010;
using namespace std;
int l,n;
int ans[60][60];
int a[60];
int dfs(int l,int r)
{
if(l==r||l+1==r)
return 0;
if(ans[l][r]!=0)
return ans[l][r];
if(l+2==r)
return ans[l][r]=a[r]-a[l];
int ret=inf;
for(int i=l+1;i<=r-1;i++)
ret=min(ret,a[r]-a[l]+dfs(l,i)+dfs(i,r));
return ans[l][r]=ret;
}
int main()
{
while(scanf("%d",&l)!=EOF)
{
if(l==0)
return 0;
scanf("%d",&n);
mem(ans,0);
a[0]=0;
a[n+1]=l;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int anss=dfs(0,n+1);
printf("The minimum cutting is %d.\n",anss);
}
return 0;
}