您的位置:首页 > 其它

uvalive 3983(dp)

2015-02-16 12:30 351 查看
题意:有一个机器人要捡n个垃圾到垃圾桶(0, 0)里,给出了机器人最多可以捡多重的垃圾c,然后给出了n个垃圾的位置和重量,机器人只能按给出的顺序捡垃圾,然后一起扔到垃圾桶里,问把所有垃圾清理完机器人行走的最短距离。

题解:状态转移方程f[j] = min(f[j], f[i] + Manhattan(i) + Manhattan(j) + dist(i + 1, j)),更新出最短行走距离。

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 100005;
int x
, y
, w
, n, c;
int f
, dis
;

int main() {
int t;
scanf("%d", &t);
while (t--) {
scanf("%d%d", &c, &n);
dis[0] = x[0] = y[0] = w[0] = 0;
for (int i = 1; i <= n; i++) {
scanf("%d%d%d", &x[i], &y[i], &w[i]);
dis[i] = abs(x[i] - x[i - 1]) + abs(y[i] - y[i - 1]) + dis[i - 1];
}
memset(f, INF, sizeof(f));
f[0] = 0;
for (int i = 0; i <= n; i++) {
int temp = 0;
for (int j = i + 1; j <= n; j++) {
temp += w[j];
if (temp > c)
break;
f[j] = min(f[j], f[i] + x[i + 1] + y[i + 1] + x[j] + y[j] + dis[j] - dis[i + 1]);
}
}
printf("%d\n", f
);
if (t)
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uva