P3431 [POI2005]AUT-The Bus-二维偏序DP

  •  
  • P3431 [POI2005]AUT-The Bus
  • 思路 :路线是向右上方运动的。我们首先对y排序,离散化.然后很容易发现,我们的状态转移为
  •  f [ i ] = f [ j ] + v a l [ i ] ( x [ i ] > x [ j ]  & &  y [ i ] >  y [ j ] ),这时候维护当前位置之前的最大值即可.
  • 按x进行排序 ,树状数组查询 1 - y [ i ]  最值,并不断更新即可。
  • #include<bits/stdc++.h>
    using namespace std;
    #define maxn 123456
    #define lowbit(x) x&-x
    int n,m,k,ans,now,cnt;
    int tree[maxn];
    struct node
    {
        int x,y,w;
    } a[maxn];
    bool cmp1(node c,node d)
    {
        return c.y<d.y;
    }
    bool cmp2(node c,node d)
    {
        if(c.x==d.x)return c.y<d.y;
        return c.x<d.x;
    }
    void updata(int x,int y)
    {
        while(x<=cnt)
        {
            tree[x]=max(tree[x],y);
            x+=lowbit(x);
        }
    }
    int query(int x)
    {
        int ret=0;
        while(x)
        {
            ret=max(ret,tree[x]);
            x-=lowbit(x);
        }
        return ret;
    }
    int main()
    {
        now=cnt=ans=0;
        scanf("%d%d%d",&n,&m,&k);
        for(int i=0; i<k; i++)
            scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].w);
        sort(a,a+k,cmp1);
        for(int i=0; i<k; i++)
        {
            if(a[i].y>now)
            {
                now=a[i].y;
                cnt++;
            }
            a[i].y=cnt;
        }
        sort(a,a+k,cmp2);
        for(int i=0; i<k; i++)
        {
            now=query(a[i].y)+a[i].w;
            updata(a[i].y,now);
            ans=max(ans,now);
        }
        printf("%d\n",ans);
        return 0;
    }
    

     

  •  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值