简单的dp问题,d(i,j)表示第i个切口到第j个切口的最优解。
#include <iostream>
#include <limits>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
using namespace std;
const int size = 1000 + 10;
const int n_size = 50 + 10;
int c[n_size];
int d[n_size][n_size];
int dp(int x , int y)
{
if(y-x < 2) return d[x][y] = 0;
if(d[x][y] >= 0) return d[x][y];
int m = numeric_limits<int>::max();
for(int i = x + 1 ; i < y ; ++i)
{
int r = dp(x , i) + dp(i , y);
if(r < m) m = r;
}
return d[x][y] = m + c[y] - c[x];
}
int main()
{
int n;
while(scanf("%d" , &n) == 1 && n)
{
int m;
scanf("%d" , &m);
c[0] = 0 ; c[m+1] = n;
for(int i = 1 ; i <= m ; ++i)
scanf("%d" , c + i);
memset(d , -1 , sizeof(d));
printf("The minimum cutting is %d.\n" , dp(0 , m + 1));
}
return 0;
}