区间dp,基本裸题
dp[i][j] = dp[i][k] + dp[k][j] + val(j-i) ;
枚举给定的点即可
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#define min(a,b) (a<b?a:b)
#define FOR(a,i,b) for( i = a ; i <= b ; ++i )
#define CLR(arr,x) memset(arr,x,sizeof(arr))
using namespace std;
const int maxn = 100 ;
const int inf = 0x3fffffff ;
int a[maxn] , b[maxn] ;
int temp[maxn][maxn] ;
int n ,k;
void init() {
CLR(a,0) ;
CLR(temp,0) ;
}
int dp(int l , int r ) {
if( r-l==1 ) return 0 ;
int& ans = temp[l][r] ;
if( ans > 0 ) return ans ;
ans = inf ;
for( int i = l+1 ; i < r ; ++i ) {
ans = min(ans, dp(l,i)+dp(i,r)+a[r]-a[l]) ;
}
return ans ;
}
void scan(){
scanf("%d",&k) ;
int i ;
a[0] = 0;
a[k+1] = n ;
FOR(1,i,k){
scanf("%d",&a[i]) ;
}
dp(0,k+1) ;
}
int main() {
while(~scanf("%d",&n),n) {
init() ;
scan() ;
printf("The minimum cutting is %d.\n",temp[0][k+1]) ;
}
return 0 ;
}