总时间限制:1000ms  内存限制:32768kB

描述

你在一个N*M的区域中,一开始在(1,1)的位置,每个位置有可能有金子,也有可能不能到达,也有可能有传送门。你只能往右或者下走,不能走出这个区域。当你位于传送门时,传送门你可以选择使用或者不使用,使用的次数无限,若使用则传送到传送门指定的位置。每个位置的金子你可以拿走它,问最后你最多能够拿走多少金子。

输入
首先测试数据组数T。
对于每组测试数据,先输入两个整数N,M(2<=N,M<=40)。
接下来是一个N*M的矩阵,表示每个位置的内容X,若0<=X<=9,表示该位置的金子个数为X,若X为'*',表示该位置有一个传送门,若X为'#',表示该位置不可到达。
假设传送门的个数为K个,接下来K行,每行两个整数x,y(x大于等于0小于n,y大于等于0小于m),依次表示每个传送门传送的位置,顺序是从第一行开始从上到下扫描,每一行从左往右扫描。
输出
对于每组数据,输出能够得到的最多的金子的个数。
样例输入
1
2 2
11
1*
0 0
样例输出
3

传送门到传送点之间的区域是一个强连通分图,可以缩成图上的一个点,再用记忆化搜索求解。

#include <stdio.h>
#include <string.h>
#include<iostream>
#include <vector>
#include <stack>
#include<queue>
using namespace std;
#define INF 999999
#define MIN(a,b) ((a)<(b)?(a):(b))
#define N 2500              // 题目中可能的最大点数
stack<int>sta;                // 存储已遍历的结点
vector<int>gra[N];            // 邻接表表示图
int dfn[N];                 // 深度优先搜索访问次序
int low[N];                 // 能追溯到的最早的次序
int InStack[N];             // 检查是否在栈中(2为在栈中,1为已访问,且不在栈中,0为不在)
vector<int> Component[N];     // 获得强连通分量结果
int InComponent[N];         // 记录每个点在第几号强连通分量里
int indexx,ComponentNumber; // 索引号,强连通分量个数
int map[50][50];            // 映射
int high,wight;             // 图高宽
int cnt;                    // 点数
int gatex[N];               // 传送门坐标
int gatey[N];
int goal[50][50];           // 每点金子数
int Component_goal[N];      // 每强连通分量金子数
int num_gate;               // 传送门数量
int ans;                    // 最多金子数
vector<int>gra_c[N];      //邻接表缩点图
int dp[N];                  //记忆化搜索void init(void)
{ans=0;cnt=0;num_gate=0;for(int i=0;i<high;++i){for(int j=0;j<wight;++j){cnt++;map[i][j]=cnt;}}memset(dp,-1,sizeof(dp));memset(goal,0,sizeof(goal));  memset(Component_goal,0,sizeof(Component_goal));memset(dfn, 0, sizeof(dfn));memset(low, 0, sizeof(low));memset(InStack, 0, sizeof(InStack));indexx = ComponentNumber = 0;for (int i = 1; i <= cnt; ++ i){gra[i].clear();Component[i].clear();gra_c[i].clear();}while(!sta.empty())sta.pop();
}void tarjan(int u)
{InStack[u] = 2;low[u] = dfn[u] = ++ indexx;sta.push(u);for (int i = 0; i < gra[u].size(); ++ i){int t = gra[u][i];if (dfn[t] == 0){tarjan(t);low[u] = MIN(low[u], low[t]);} else if (InStack[t] == 2){low[u] = MIN(low[u], dfn[t]);}}if (low[u] == dfn[u]){++ ComponentNumber;while (!sta.empty()){int j = sta.top();sta.pop();InStack[j] = 1;Component[ComponentNumber].push_back(j);InComponent[j]=ComponentNumber;if (j == u)break;}}
}int DFS(int x){if(dp[x]!=-1)return dp[x];else{int mmax=0;for(int i=0;i<gra_c[x].size();++i){mmax=max(mmax,DFS(gra_c[x][i]));}dp[x]=Component_goal[x]+mmax;return dp[x];}
}void input(void)
{for(int i=0;i<high;++i){for(int j=0;j<wight;++j){char ch=getchar();if(ch>='0'&&ch<='9')goal[i][j]=ch-'0';else if(ch=='#')goal[i][j]=-1;else if(ch=='*'){goal[i][j]=0;num_gate++;gatex[num_gate]=i;gatey[num_gate]=j;}}getchar();}for(int i=0;i<high;++i){for(int j=0;j<wight;++j){if(goal[i][j]==-1)continue;if(i+1<high&&goal[i+1][j]!=-1)gra[map[i][j]].push_back(map[i+1][j]);if(j+1<wight&&goal[i][j+1]!=-1)gra[map[i][j]].push_back(map[i][j+1]);}}for(int i=1;i<=num_gate;i++){int a,b;scanf("%d%d",&a,&b);if(goal[a][b]!=-1)gra[map[gatex[i]][gatey[i]]].push_back(map[a][b]);}
}void solve(void)
{for(int i=1;i<=cnt;i++){if(!dfn[i])tarjan(i);} for(int i=0;i<high;++i){for(int j=0;j<wight;++j){Component_goal[InComponent[map[i][j]]]+=goal[i][j];}}for(int i=1;i<=cnt;++i){for(int j=0;j<gra[i].size();++j){if(InComponent[i]==InComponent[gra[i][j]])continue;gra_c[InComponent[i]].push_back(InComponent[gra[i][j]]);}}ans=DFS(InComponent[map[0][0]]);printf("%d\n",ans);}int main()
{int t;scanf("%d",&t);while(t--){scanf("%d%d\n",&high,&wight);init();input();solve();}return 0;
}

【缩点】SWUST 2014校赛 H:挖金子相关推荐

  1. 递推(2019暑期集训第一次校赛-H.统计ccsu)

    2019暑期集训第一次校赛-H.统计ccsu 链接:https://ac.nowcoder.com/acm/contest/1068/H 来源:牛客网 题目描述 给一个长度不超过1e5的字符串s,字符 ...

  2. 第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛H

    思路: 首先要知道:11+12+13+14+...++1n=ln(n)+C \dfrac{1 }{1} + \dfrac{1 }{2} + \dfrac{1 }{3} + \dfrac{1 }{4}+ ...

  3. 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛H题小Y与多米诺骨牌(线段树优化dp)

    题意 题目链接:https://www.nowcoder.com/acm/contest/91/H 来源:牛客网 题解 设l[i]l[i]l[i]为向左推第iii个骨牌最远能影响到的骨牌的编号,r[i ...

  4. CQUPT第九届ACM校赛 H 锦鱼突刺 题解

    题目: Description CC公主被抓走了,为了救回她,你要通过九个关卡的考验. 在这一关中,你要通过一座浮桥.浮桥由多块漂浮的木板组成.不幸的是,水里生存着一种凶残的锦鱼,锦鱼的突刺会刺穿木板 ...

  5. CQUPT第九届ACM校赛 H 夺命毒奶

    1524: 夺命果奶 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 187  Solved: 16 [Submit][Status][Web Boar ...

  6. 2014校赛 猫和老鼠

    题目描述 Tom 和 Jerry 的故事又开始了.一天Jerry在偷得k块奶酪之后要返回自己的家中.现已知Jerry目前的位置在数轴上的坐标为0,Jerry的家在数轴上的坐标为n,Jerry每次只能从 ...

  7. 2014湖南农业大学ACM校赛

    湖南农业大学 2014年 ACM 校赛Problem 2014 /2/23  星期日  12:30-17:30 A.搜素      1794.查找指定的字符串      B.链表      1795 ...

  8. 2014哈商大ICPC/ACM校赛解题报告

    被debug邀请去參加校赛,哎,被虐..我对不起工大.. 由于本人不搞ACM,算法处于HelloWorld水准.. 虽然题目除了鸟不拉屎星人之外都非常水,但我能做到这个程度,全然是超水平发挥了.. 数 ...

  9. 大学生程序设计创新实践基地2022年冬季校赛(NPU ACM Winter Contest)

    大学生程序设计创新实践基地2022年冬季校赛(NPU ACM Winter Contest) 总述 总体考察对于板子的熟练变换,以及考察离谱地使用python和对getchar()以及EOF的基础掌握 ...

最新文章

  1. 手机通讯录分组名称_基于Aandroid的手机操作系统(7)
  2. 测量 XW-HLR26-24G 微波雷达模块的性能测试
  3. 中国碳酸氢钠干粉灭火剂市场产量规模与未来竞争走势研究报告2022年
  4. 网络游戏程序中解决加载卡顿的有效方法
  5. java蓝桥杯凑算是,第七届蓝桥杯JAVA B组真题解析-凑算式(第三题)
  6. java中的基本数据类型_Java中的基本数据类型和引用数据类型
  7. selenium java测试_java+selenium 自动化测试
  8. Lintcode1 A+B Problem solution 题解
  9. 60. 理解 Ajax 性能
  10. plsqldev连oracle,plsqldev怎么联接oracle客户端
  11. origin画图初步入门
  12. 打开JMeter报错:Could not reserve enough space for 1048576KB object heap
  13. PageHelper.startPage分页的使用和pageSize的值和list相同导致循环出来的total总数不对
  14. 我的 Serverless 实战 — Serverless 腾讯云文字识别(OCR)详细部署过程
  15. Easy ip 简单配置实验
  16. 使用SpringBoot+Shiro实现记住我功能
  17. 多卡聚合设备基于融合系统指挥平台的解决方案
  18. 高可用免费代理ip爬取实战
  19. ArrayList和LinkedList的底层源码之我见
  20. 让你脊背发凉的10个故事

热门文章

  1. 【磨刀不误砍柴工】安装 virtuoso IC617 遇到 version `CXXABI_1.3.8‘ not found 的解决方法
  2. stc12c5a32s2c语言程序,为什么STC12C5A32S2程序不能烧录进去啊
  3. 指尖江湖服务器维护,指尖江湖服务器修复第一日,玩家重新审视游戏:我觉得海星...
  4. 计算机与交换机基本网络设置方法,交换机配置方法 网络交换机的详细配置方法(图文教程)...
  5. C# WPF TabControl控件用法详解
  6. ANSI/ESD最新标准
  7. 2022年信息学部物联网工程学院学生科协第二次软件大培训
  8. HTML5期末大作业:在线电影网站设计——网上电影票预订网站 HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码
  9. 「自动化」聊起来简单,做起来难 | 谈效风生
  10. 按键精灵取窗口句柄输入按键_如何通过一次按键调整所有窗口列的大小