题目链接
https://vjudge.net/problem/UVA-10003
d[i][j]表示在i到j这一段上切一刀的最小权和,如果没有切过就为0。
状态转移方程为ans(i,j)=min{ans(i,k)+ans(k)(j) | i<k<j } +d[j]-d[i]
#include<bits/stdc++.h>
#include<algorithm>
#define max 0x3f3f3f3f
using namespace std;
int d[55];
int ans[55][55];
int main(){
int distance;
int length,j;
while(scanf("%d",&distance)){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&d[i]);
d[0]=0,d[n+1]=distance;
for(length=1;length-1<=n+1;length++)
for( int i=0;i+length-1<=n+1;i++){
j=i+length-1;
ans[i][j]=0;
int minv=max;
for(int k=i+1;k<j;k++){
int temp=ans[i][k]+ans[k][j]+d[j]-d[i];
if(minv>temp)
minv=temp;
}
if(minv!=max)
ans[i][j]=minv;
}
printf("The minimum cutting is %d.\n", ans[0][n+1] );
}
}