记忆化搜索。还有递归调用。大概题意就是一根木棍的长度length,按他所给的点切割。求最大的价值。
X , Y 表示 X点到Y点的。转移方程vis[X][Y] = min ( DP[X][i] + DP[i][Y] + ar[Y] - ar[X] ) ,i表示X,Y之间的切割点
#include <iostream>
#include <algorithm>
#include <cstring>
const int INF = 500000;
using namespace std;
int vis[60][60], ar[60], Case, length;
int DP ( int x, int y ) {
if ( vis[x][y] != -1 ) return vis[x][y];
vis[x][y] = INF;
for ( int i = x + 1; i < y; ++i )
vis[x][y] = min ( vis[x][y], DP ( x, i ) + DP ( i, y ) + ( ar[y] - ar[x] ) );
if ( vis[x][y] == INF ) vis[x][y] = 0;
return vis[x][y];
}
int main ( ) {
while ( cin >> length, length ) {
cin >> Case;
ar[0] = 0;
ar[Case + 1] = length;
for ( int i = 1; i <= Case; ++i )
cin >> ar[i];
memset ( vis, -1, sizeof ( vis ) );
cout << "The minimum cutting is " << DP ( 0, Case + 1 ) << "." <<endl;
}
return 0;
}