BZOJ 3892 Usaco2014 Dec Marathon DP

题目大意:给出平面上的一些点,要求按顺序遍历,费用是两点之间的曼哈顿距离,可以跳过k次,问最少需要花费多少。


思路:O(n^3)dp就行了。


CODE:

#define _CRT_SECURE_NO_WARNINGS

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 510
using namespace std;

struct Point{
	int x,y;

	void Read() {
		scanf("%d%d",&x,&y);
	}
}point[MAX];

int cnt,t;
int f[MAX][MAX];

inline int Calc(const Point &p1,const Point &p2)
{
	return abs(p1.x - p2.x) + abs(p1.y - p2.y);
}

int main()
{
	cin >> cnt >> t;
	for(int i = 1; i <= cnt; ++i)
		point[i].Read();
	memset(f,0x3f,sizeof(f));
	f[1][t] = 0;
	for(int i = 2; i <= cnt; ++i)
		for(int j = 1; j < i; ++j)
			for(int k = t; k >= i - j - 1; --k)
				f[i][k - (i - j - 1)] = min(f[i][k - (i - j - 1)],f[j][k] + Calc(point[i],point[j]));
	cout << f[cnt][0] << endl;
	return 0;
}


你可能感兴趣的:(dp,USACO,bzoj)