• Problem:F
  • Time Limit:1000ms
  • Memory Limit:65535K

题目

Description

贪吃蛇大家一定都玩过吧,现在宋哥也要玩这个游戏,最初的时候贪吃蛇从屏幕的左下角出发,但是有一个非常不幸的事情,就是宋哥的游戏机的左键和下键坏掉了,这意味着什么?没错!他只能操控他的蛇向右或向上走了,假设屏幕被划分为109*109的格子,而贪吃蛇从坐标为(1,1)的格子出发,每次操作可以从坐标为(x,y)的格子前往坐标为(x+1,y)或(x,y+1)的格子,在所有格子中有一些格子中有一些食物,宋哥现在想知道,他的贪吃蛇最多能吃到多少食物呢?

Input

输入的第一行包含一个数字T(1<=T<=10),代表数据组数,之后的每组数据的每一行包含一个数字n (1<=n<=1000),代表有食物的格子数量,之后的n行每一行包含三个数字xi(1<=xi<=109),yi(1&lt;=xi&lt;=109),pi(1<=xi<=10^6),分别代表格子的坐标和在这个格子里的食物数量。

Output

输出T行,第i行为第i组数据的答案。

Sample Input

2

3

1 1 1

2 2 2

3 3 3

3

1 3 1

2 2 2

3 1 3

Sample Output

6

3

Hint

Source

MGH

思路

看起来像很经典的dp问题,但是区别是点很稀疏,只有1e3的点,却有1e9*1e9的棋盘,考虑将点位置重新紧密排布, 建立一个映射将稀疏点集\(S\)映射到紧密点集\(P'\)即 \(f:\{P_i = (X_i,Y_i)\in S\}\rightarrow \{P'_i=(X'_i,Y'_i)\in S'\}\)使得\(S'\)方便使用dp。

需要保证重新排布后性质不变,分析后得知需要满足保持原本的横纵坐标的大小关系即

\[\forall P_i, P_j\in S
\left\{
\begin{array}{c}
x_i < x_j \rightarrow x'_i < x'_j\\
x_i = x_j \rightarrow x'_i = x'_j\\
x_i > x_j \rightarrow x'_i > x'_j\\
\end{array}
\right.
\]
\[\forall P_i, P_j\in S
\left\{
\begin{array}{c}
y_i < y_j \rightarrow y'_i < y'_j\\
y_i = y_j \rightarrow y'_i = y'_j\\
y_i > y_j \rightarrow y'_i > y'_j\\
\end{array}
\right.
\]

如下图所示方法,删除所有空行和空列可以实现。



算法实现

  1. 对\(x\)坐标由小到大排序
  2. 对于每个点遍历从0开始分配新的\(x'\)坐标,如果某个点\(x\)坐标与上一个点相同,则分配相同的\(x'\)坐标,而不递增\(x'\)。

之后再对\(y\)坐标进行同样的操作。

完成后对\(S'\)点集进行DP即可

代码如下

#include <bits/stdc++.h>

using namespace std;

struct Food
{
int x, y, v, _x, _y;//_x和_y代表映射后坐标
} food[1020]; int mp[1020][1020], dp[1020][1020]; bool Cmp1(Food f1, Food f2)//x排序
{
return f1.x < f2.x;
}
bool Cmp2(Food f1, Food f2)//y排序
{
return f1.y < f2.y;
} int Find(int x, int y)//Dp
{
if(dp[x][y] != -1)
return dp[x][y]; int res = 0;
if(x-1 >= 0)
res = max(res, Find(x-1,y));
if(y-1 >= 0)
res = max(res, Find(x,y-1));
return dp[x][y] = res + mp[x][y];
}
int main()
{
int T;
cin >> T;
while(T--)
{
int n;
cin >> n;
for (int i = 0; i < n; i ++)
scanf("%d%d%d", &food[i].x, &food[i].y, &food[i].v); //x排序并分配新坐标
sort(food, food+n, Cmp1);
int ind_x = 1;
food[0]._x = 1;
for (int i = 1; i < n; i ++)
if(food[i].x == food[i-1].x)
food[i]._x = ind_x;
else
food[i]._x = ++ind_x; //y排序并分配新坐标
sort(food, food+n, Cmp2);
int ind_y = 1;
food[0]._y = 1;
for (int i = 1; i < n; i ++)
if(food[i].y == food[i-1].y)
food[i]._y = ind_y;
else
food[i]._y = ++ind_y; //普通DP过程
for (int i = 0; i <= 1000; i ++)
for (int j = 0; j <= 1000; j ++)
mp[i][j] = 0; for (int i = 0; i < n; i ++)
mp[food[i]._x][food[i]._y] = food[i].v; for (int i = 0; i <= ind_x; i ++)
for (int j = 0; j <= ind_y; j ++)
dp[i][j] = -1; dp[0][0] = 0; cout << Find(ind_x,ind_y) << endl;
}
return 0;
}

NEFU OJ Problem1485 贪吃蛇大作战 题解的更多相关文章

  1. Unity3D游戏贪吃蛇大作战源码休闲益智手机小游戏完整项目

    <贪吃蛇大作战>一款休闲竞技游戏,不仅比拼手速,更考验玩家的策略. 视频演示: http://player.youku.com/player.php/sid/XMzc5ODA2Njg1Ng ...

  2. 贪吃蛇大作战canvas实现(手机触屏操作)--地图逻辑

    //html部分 <!DOCTYPE html><html><head lang="en"> <meta charset="UT ...

  3. [Untiy]贪吃蛇大作战(五)——游戏主界面

    接着上一节: 4.AI蛇的设计 这里AI蛇大部分代码都可以参照主角的代码,我这里的实现其实还可以进行改进.基本原理就是蛇创建之后给蛇一个随机方向的单位向量,AI蛇的蛇头添加一个比蛇头大两三倍大小的碰撞 ...

  4. [Untiy]贪吃蛇大作战(四)——游戏主界面

    游戏主界面: 由于这个场景比较复杂,需要分几个部分实现: 1.游戏背景 首先我们的游戏场景上包括了一个大的背景图片,之外再包围一个红色的区域.中间的区域才是可活动的区域,周围通过碰撞检测盒来检测是否有 ...

  5. [Untiy]贪吃蛇大作战(三)——商店界面

    游戏商店界面: 实际的效果图如下: 要实现这个滑动,首先我们需要,一个内容显示区域,一个内容滚动区域,如下图: 其中ItemContent挂载的组件如下: 红框标注的地方是右方的滑动块. 然后Item ...

  6. [Untiy]贪吃蛇大作战(二)——规则界面

    游戏规则界面: 从界面上可以看出,一共有三个按钮,两个切换按钮和一个退出按钮. 一共三张规则图片Sprite,我们通过设置其是否为Active来控制显示,其控制脚本代码如下: using System ...

  7. [Untiy]贪吃蛇大作战(一)——开始界面

    前言: 刚学unity没多久吧(大概1个月多点),这是我自己做的除官网之外的第一个游戏demo,中间存在很多不足的地方,但是还是希望可以给需要的人提供一些思路和帮助,有问题的小伙伴可以找我一起探讨一起 ...

  8. Java实现贪吃蛇游戏【代码】

    花了两个下午写了一个贪吃蛇小游戏,本人想写这游戏很长时间了.作为以前诺基亚手机上的经典游戏,贪吃蛇和俄罗斯方块一样,都曾经在我们的童年给我们带来了很多乐趣.世间万物斗转星移,诺基亚曾经作为手机业的龙头 ...

  9. 题解和总结——noip2019集训测试赛(一)贪吃蛇+字符串+都城

    Problem A: 贪吃蛇 描述 Input Output Sample Input [样例输入1] 4 5 ##... ..1#@ 432#. ...#. [样例输出1] 4 [样例输入2] 4 ...

  10. c语言贪吃蛇详解-2.画出蛇

    c语言贪吃蛇详解-2.画出蛇 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识点. 蛇的身 ...

随机推荐

  1. Power AutoMate: 变量专栏

    背景 本篇对Power AutoMate的变量功能进行记录与讲解 设置变量 拖拽功能块并赋值 测试一些数据类型 测试中发现与程序中的类型,并没有什么差别 截断数字 对浮点数进行一些操作 选择需要操作的 ...

  2. 好用工具: windows terminal

    直接在微软商店搜索该软件即可,本文介绍无法使用微软商店的情况. 解题思路 当我们无法下载某个软件时,可直接去Github中寻找该项目,知道该软件资源并下载. 下载地址 https://github.c ...

  3. jQuery事件自动触发

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 王道oj/problem13(用递归数楼梯)

    网址:http://oj.lgwenda.com/problem/13 思路:用递归写step(int n):return step(n-1)+step(n-2); 停止条件是:n=1为1:n=2为2 ...

  5. 谈谈 Kafka 的幂等性 Producer

    使用消息队列,我们肯定希望不丢消息,也就是消息队列组件,需要保证消息的可靠交付.消息交付的可靠性保障,有以下三种承诺: 最多一次(at most once):消息可能会丢失,但绝不会被重复发送. 至少 ...

  6. Unity的IPreprocessShaders:深入解析与实用案例

    Unity IPreprocessShaders Unity IPreprocessShaders是Unity引擎中的一个非常有用的功能,它可以让开发者在编译Shader时自定义哪些操作需要被执行.这 ...

  7. P1880 [NOI1995] 石子合并 题解

    区间DP. 首先将其复制一遍(因为是环),也就是经典的破环成链. 设 \(f[i][j]\) 表示将 \(i\) 到 \(j\) 段的石子合并需要的次数. 有 \[f[i][j] = 0(i = j) ...

  8. BurpSuite设置上游代理访问内网

    转载原文 原理知道了后,开始! 拿到B的shell后,添加路由 拿到B的shell后,开启sock4 在D主机上设置好 最后成功抓到包

  9. 【测试】自定义配置 RocksDB 进行 YCSB 测试

    目录 简介 编译 RocksDB 编译 YCSB 修复报错 自定义配置 RocksDB 进行 YCSB 测试 参考资料 本文主要记录在利用 YCSB 使用配置文件测试 RocksDB 的过程中遇到的一 ...

  10. [远程Call]32位远程多参数带返回调用

    [远程Call]32位远程多参数带返回调用 引子 在Windows上可以使用CreateRemoteThread实现远程Call,但是有不带返回值且只能传递一个参数的限制. 解决思路 将多个参数利用V ...