题目链接
题目大意
有一根长为n的木棍,截一次木棍的代价为这个木棍的长度,现在知道要在这个木棍的哪里切割,问你最小的代价是多少
解题思路
写的时候没有看出来是个区间DP
dp[i][j]代表的是在第i个切割点和第j个切割点之间切割的最小代价
那么:dp[i][j]=min(minn,dp[i][k]+dp[j][r]+a[j]-a[i]);(k是区间i,j中的断点)
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int N=1005;
int a[N],dp[N][N];
const int inf=0x3f3f3f3f;
int main()
{
int len,n;
while(~scanf("%d",&len))
{
if(len==0)
break;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
a[0]=0;
a[n+1]=len;
memset(dp,0,sizeof(dp));
for(int i=1;i<=n+1;i++)//区间长度
{
for(int j=0;j+i<=n+1;j++)
{
int l=j,r=j+i;//左端点和右端点
int minn=inf;
for(int k=l+1;k<r;k++)
{
minn=min(minn,dp[l][k]+dp[k][r]+a[r]-a[l]);
}
if(minn<inf)
dp[l][r]=minn;
}
}
printf("The minimum cutting is %d.\n",dp[0][n+1]);
}
return 0;
}