动态规划的题目,dp[i][j]中i和j分别代表切割点下标的起点和终点,point[k]存储第k个切割点的位置,状态转换方程:
情况1:dp[i][j] = 0; //i+1 == j
情况2:dp[i][j] = min{dp[i][k] + dp[k][j] + (point[j]-point[i]) | k>i&&k<j} //其他情况
由于k是位于i和j之间的,所以注意迭代的顺序i是递减的,j是递增的。好像输入的切割点本来就是递增的,我没有对切割点进行排序也过了,严谨一点的话要先排序。
#include <stdio.h>
#define INF 999999999
int point[60];
int dp[60][60];
void func(int len, int n){
int i, j, k;
int temp;
for(i=n; i>=0; i--){
for(j=i+1; j<=n+1; j++){
if(j == i+1){
dp[i][j] = 0;
}
else{
dp[i][j] = INF;
for(k=i+1; k<=j-1; k++){
temp = dp[i][k] + dp[k][j] + point[j] - point[i];
if(dp[i][j] > temp)
dp[i][j] = temp;
}
}
}
}
printf("The minimum cutting is %d.\n", dp[0][n+1]);
}
int main(void){
int len, n, i;
//freopen("input.dat", "r", stdin);
while(scanf("%d",&len), len){
scanf("%d", &n);
point[0] = 0;
point[n+1] = len;
for(i=1; i<=n; i++){
scanf("%d", point+i);
}
func(len, n);
}
return 0;
}