题目大意:给出平面上的一些点,要求按顺序遍历,费用是两点之间的曼哈顿距离,可以跳过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;
}