您的位置:首页 > 其它

UVa 10003 - Cutting Sticks

2013-04-01 15:20 218 查看
记忆化搜索。还有递归调用。大概题意就是一根木棍的长度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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: