这道题呢当时做的时候确实没有想到其他做法只想到了暴力动态规划,但是评测的时候居然 A A 了就十分惊讶。其实做完这道题之后想一想为什么暴力这么高的时间复杂度可以掉,我们平时在计算时间复杂度的时候都是从最坏情况的角度考虑而往往忽略了实际当中的时间复杂度,显然这道题的暴力方程的最坏时间复杂度十分大的,但是它的常数其实远远小于 1 1 ,这就是为什么我们的暴力动态规划可以掉这道题的原因了。
参考代码:
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define DB double
#define SG string
#define LL long long
#define DP(A,B) DP[A][B]
using namespace std;
const LL Max=5e2+5;
const LL Mod=1e9+7;
const LL Inf=1e18;
LL N,M,Ans=Inf*1.0,X[Max],Y[Max],DP[Max][Max];
inline LL Read(){
LL X=0;char CH=getchar();bool F=0;
while(CH>'9'||CH<'0'){if(CH=='-')F=1;CH=getchar();}
while(CH>='0'&&CH<='9'){X=(X<<1)+(X<<3)+CH-'0';CH=getchar();}
return F?-X:X;
}
inline void Write(LL X){
if(X<0)X=-X,putchar('-');
if(X>9)Write(X/10);
putchar(X%10+48);
}
int main(){
LL I,J,K;
// freopen("run.in","r",stdin);
// freopen("run.out","w",stdout);
N=Read(),M=Read();
for(I=1;I<=N;I++){
X[I]=Read(),Y[I]=Read();
for(J=0;J<=M;J++){
DP(I,J)=Inf;
}
}DP(1,0)=0;
for(I=2;I<=N;I++){
for(K=0;K<=M;K++){
DP(I,K)=min(DP(I,K),DP(I-1,K)+abs(X[I]-X[I-1])+abs(Y[I]-Y[I-1]));
}
for(J=1;J<I;J++){
for(K=0;K<=M-(I-J-1);K++){
DP(I,K+(I-J-1))=min(DP(I,K+(I-J-1)),DP(J,K)+abs(X[I]-X[J])+abs(Y[I]-Y[J]));
}
}
}
for(I=1;I<=M;I++){
Ans=min(Ans,DP(N,I));
}
Write(Ans);
return 0;
}