状态方程:dp[i,j] = min(dp[i,k], dp[k,j])+j-i,记忆化搜索。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const int MAXN = 52;
int stick[MAXN], n;
int dp[MAXN][MAXN];
int DP(int l, int r)
{
if(dp[l][r] != -1)
{
return dp[l][r];
}
else if(l == r-1)
{
return dp[l][r] = 0;
}
dp[l][r] = 10000;
for(int k=l+1; k<r; ++k)
{
int temp = DP(l, k) + DP(k, r) + stick[r] - stick[l];
if(temp < dp[l][r])
dp[l][r] = temp;
}
return dp[l][r];
}
int main()
{
int l;
while(scanf("%d", &l) && l)
{
scanf("%d", &n);
stick[0] = 0;
stick[n+1] = l;
memset(dp, -1, sizeof(dp));
for(int i=1; i<=n; ++i)
scanf("%d", &stick[i]);
printf("The minimum cutting is %d.\n", DP(0, n+1));
}
return 0;
}