您的位置:首页 > 其它

UVA - 10003 - Cutting Sticks(动态规划)

2014-03-09 15:19 483 查看
点击打开链接

题意:给出一个长度为L的木棍和N个要切的点pt[i],每次切割的代价为切割前木棍的长度,求总代价的最小值。

记忆化搜索:d[x][y] = 区间[x, y]的最小代价。

d[x][y] = min(d[x][y], dp(x, pt[i])+dp(pt[i], y)+(y-x));

2.179MS……

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAX_N = 1001, INF = 0x3f3f3f3f>>1;
int N, L;
int d[MAX_N][MAX_N], pt[51];
int dp(int x, int y)
{
int cuted = 0;
if(d[x][y] != -1)
return d[x][y];
d[x][y] = INF;
for(int i = 0; i < N; i++)
if(x<pt[i] && pt[i]<y)
{
cuted = 1;
d[x][y] = min(d[x][y], dp(x, pt[i])+dp(pt[i], y)+(y-x));
}
if(!cuted) d[x][y] = 0;
return d[x][y];
}
int main()
{
//freopen("in.txt", "r", stdin);
while(scanf("%d", &L), L)
{
scanf("%d", &N);
for(int i = 0; i < N; i++)
scanf("%d", pt+i);
memset(d, -1, sizeof(d));
int ans = dp(0, L);
printf("The minimum cutting is %d.\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态规划