DP(01背包)+离散化——网格贪吃蛇

  • Post author:
  • Post category:其他


在这里插入图片描述

在这里插入图片描述

离散化的步骤:

排序,去重

得到的序列中元素的位置就是离散化后的坐标。

例如(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 版权协议,转载请附上原文出处链接和本声明。