试题 算法提高 网格贪吃蛇
资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
那个曾经风靡全球的贪吃蛇游戏又回来啦!这次贪吃蛇在m行n列的网格上沿格线爬行,从左下角坐标为(0,0)的格点出发,在每个格点处只能向上或者向右爬行,爬到右上角坐标为(m-1,n-1)的格点时结束游戏。网格上指定的格点处有贪吃蛇喜欢吃的豆豆,给定网格信息,请你计算贪吃蛇最多可以吃多少个豆豆。
输入格式
输入数据的第一行为两个整数m、n(用空格隔开),分别代表网格的行数和列数;第二行为一个整数k,代表网格上豆豆的个数;第三行至第k+2行是k个豆豆的横纵坐标x、y(用空格隔开)。
输出格式
程序输出一行,为贪吃蛇可吃豆豆的最大数量。
样例输入
10 10
10
3 0
1 5
4 0
2 5
3 4
6 5
8 6
2 6
6 7
3 1
样例输出
5
数据规模和约定
1≤m, n≤10^6,0≤x≤m-1,0≤y≤n-1,1≤k≤1000
代码
#include<bits/stdc++.h>
using namespace std;
#define PII pair<int,int>
const int N=10005;
vector<int> xp,yp;
vector<PII> points;
int g[N][N];
int dp[N][N];
int findx(int n){
int l=0,r=xp.size();
while(l<r){
int m=l+((r-l)>>1);
if(xp[m]>=n)r=m;
else l=m+1;
}
return l;
}
int findy(int n){
int l=0,r=yp.size();
while(l<r){
int m=l+((r-l)>>1);
if(yp[m]>=n)r=m;
else l=m+1;
}
return l;
}
int main(){
int n,m;
cin>>n>>m;
int k;
cin>>k;
for(int i=0;i<k;i++){
int x,y;
cin>>x>>y;
xp.push_back(x);
yp.push_back(y);
points.push_back({x,y});
}
sort(xp.begin(),xp.end());
xp.erase(unique(xp.begin(),xp.end()),xp.end());
sort(yp.begin(),yp.end());
yp.erase(unique(yp.begin(),yp.end()),yp.end());
for (int i = 0, len = points.size(); i < len; i++) { // 将每个坐标离散化后的坐标添加到地图中
PII item = points[i];
g[findx(item.first) + 1][findy(item.second) + 1] = 1;
}
int lenx = xp.size();
int leny = yp.size();
for (int i = 1; i <= lenx; i++)
for (int j = 1; j <= leny; j++) {
dp[i][j] = g[i][j];
dp[i][j] += max(dp[i - 1][j], dp[i][j - 1]);
}
cout << dp[lenx][leny] << endl; // 输出答案
return 0;
}