BZOJ P3892 [Usaco2014 Dec] Marathon【动态规划】

这道题呢当时做的时候确实没有想到其他做法只想到了暴力动态规划,但是评测的时候居然 A A 了就十分惊讶。其实做完这道题之后想一想为什么暴力这么高的时间复杂度可以A掉,我们平时在计算时间复杂度的时候都是从最坏情况的角度考虑而往往忽略了实际当中的时间复杂度,显然这道题的暴力方程的最坏时间复杂度十分大的,但是它的常数其实远远小于 1 1 ,这就是为什么我们的暴力动态规划可以A掉这道题的原因了。

参考代码:

#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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值