hdu 6447YJJ's Salesman 离散化+树状数组+DP

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6447

因为图中点的坐标值过大,达到1e9.然而只有1e5个点。所以先将其离散化。并按照二元组排序。每次对于同一行的点连续处理两次。

第一次:先考虑由上一行转移而来的情况:树状数组找到左上角的最大值+v、以及上方值的最大值。

第二次:考虑由同行的点转移来的情况。树状数组查询区间1~x-1的最大值

便利过程中维护最大值

代码丑的一批

#include
#define inf 0x3f3f3f3f
#define mod 1000000007
#define For(i,m,n) for(int i=m;i<=n;i++)
#define Dor(i,m,n) for(int i=m;i>=n;i--)
#define LL long long
#define lan(a,b) memset(a,b,sizeof(a))
#define sqr(a) a*a
using namespace std;

#define maxn 100010
int shu[maxn];

int lowbit(int i)
{
    return i&(-i);
}

int query(int i)
{
    int ans=0;
    while(i)
    {
        ans=max(ans,shu[i]);
        i-=lowbit(i);
    }
    return ans;
}

void update(int i,int p)
{
    while(i<=maxn-1)
    {
        shu[i]=max(p,shu[i]);
        i+=lowbit(i);
    }
}


struct node
{
    int x,y,v;
}a[100010];
int dp[100010];
int d[100010];

bool cmp(node a,node b)
{
    if(a.x==b.x)
        return a.y

 

你可能感兴趣的:(DP,思维,树状数组)