实际上两种写法都差不多......
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;
}
本文探讨了动态规划(DP)与深度优先搜索(DFS)两种算法在解决特定切割问题上的应用。通过对比两种算法的实现方式,展示了如何在C++中使用这两种方法求解最小切割问题。代码实例详细解释了每种方法的步骤,为读者提供了深入理解算法工作原理的机会。
342

被折叠的 条评论
为什么被折叠?



