
    
    
    
    离散化的步骤:
    
    排序,去重
    
    得到的序列中元素的位置就是离散化后的坐标。
    
    例如(2,5) (1000,500) (1000, 999)
    
    先将所有数字放入数组中并排序去重得到:
    
    2,5,500,999,1000
    
    离散化后的坐标就是
    
    (1,2) (5,3) (5,4)
    
    该题中地图很大,无法开这么大的二维数组。但实际给出的点就1000个点,所以需要进行离散化。
    
    注意,虽然只有1000个点,但却有2000个数,所以N要定到2000以上。
    
    参考文章:
    
     蓝桥杯 试题 算法提高 网格贪吃蛇(C++)
    
   
#include<bits/stdc++.h>
using namespace std;
const int N=2010;
int w[N][N],dp[N][N];
typedef pair<int,int> PII;
vector<PII>loc;
vector<int> nums;
int main()
{
    int n,m;
    cin>>n>>m;
    int k;
    cin>>k;
    while(k--)
    {
        int x,y;
        cin>>x>>y;
        loc.push_back(make_pair(x,y));
        nums.push_back(x);
        nums.push_back(y);
    }
    sort(nums.begin(),nums.end());
    nums.erase(unique(nums.begin(),nums.end()),nums.end());
    for(int i=0;i<(int)loc.size();i++)
    {
        PII point=loc[i];
        w[lower_bound(nums.begin(),nums.end(),point.first)-nums.begin()+1][lower_bound(nums.begin(),nums.end(),point.second)-nums.begin()+1]=1;
    }
    for(int i=1;i<=nums.size();i++)
    {
        for(int j=1;j<=nums.size();j++)
        {
            dp[i][j]=max(dp[i-1][j],dp[i][j-1])+w[i][j];
        }
    }
    cout<<dp[nums.size()][nums.size()];
    return 0;
}
 
版权声明:本文为A12NCH3N原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
