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