[USACO13NOV]POGO的牛Pogo-Cow

本文详细解析了USACO比赛中Pogo-Cow问题的动态规划解决方案,介绍了如何通过预处理坐标并使用动态规划来求解最大价值路径。文章通过两遍扫描确保覆盖所有可能的路径组合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[USACO13NOV]POGO的牛Pogo-Cow

Dp

题解:

1000的数据,Luogu上被n^3水过,500ms+

我能怎么办,我也很绝望啊~

f[i][j]表示第i个从第j个转移过来的最大价值
边界:f[i][i]=c[i]
转移:暴力枚举下一个

——————乱搞分割线——————
(严肃脸)
i是当前,j是上一个,k是下一个
k只能从连续的一段j中转移
或许正解是log维护区间的max?
—————————————————

Code:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#define D(x) cout<<#x<<" = "<<x<<"  "
#define E cout<<endl
using namespace std;
const int N = 1005;

int n,ans,f[N][N];

struct Point{
    int p,c;
    bool operator < (const Point &other) const { return p < other.p; }
} d[N];

inline void upd(int &a,int b){ a=max(a,b); ans=max(ans,a); }
inline int myabs(int a){ return a>=0 ? a : -a; }

void solve(){
    memset(f,0,sizeof(f));
    for(int i=1;i<=n;i++){
        upd(f[i][i],d[i].c);
        for(int k=i+1;k<=n;k++){
            int len=myabs(d[k].p-d[i].p);
            for(int j=i;j>=1;j--){
                if(myabs(d[i].p-d[j].p)>len) break;
                upd(f[k][i],f[i][j]+d[k].c);
            }
        }
    }
}

int main(){
    freopen("a.in","r",stdin);
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d%d",&d[i].p,&d[i].c);
    }
    sort(d+1,d+1+n);
//  for(int i=1;i<=n;i++) printf("%d %d\n",d[i].p,d[i].c);
    solve();
    reverse(d+1,d+1+n);
    solve();
    printf("%d\n",ans);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值