HDU 6981.Rise in Price (Beam Search 贪心)
by 0htoAi,写于2021.8.14
Problem Description
There are n×n cells on a grid, the top-left cell is at (1,1) while the bottom-right cell is at (n,n). You start at (1,1) and move to (n,n). At any cell (i,j), you can move to (i+1,j) or (i,j+1), provided that you don't move out of the grid. Clearly, you will make exactly 2n−2 steps.
When you are at cell (i,j), including the starting point (1,1) and the destination (n,n), you can take all the ai,j diamonds at this cell, and have a chance to raise the price of each diamond by bi,j dollars. You will sell all the diamonds you have with the final price in the end, and your goal is to choose the optimal path that will maximize your profits. Note that initially the price of each diamond is zero, and you have nothing to sell.
Input
The first line contains a single integer T (1≤T≤10), the number of test cases. For each test case:
The first line contains a single integer n (1≤n≤100), denoting the size of the grid.
Each of the following n lines contains n integers, the i-th line contains ai,1,ai,2,…,ai,n (1≤ai,j≤106), denoting the number of diamonds in each cell.
Each of the following n lines contains n integers, the i-th line contains bi,1,bi,2,…,bi,n (1≤bi,j≤106), denoting how much you can raise the price in each cell.
It is guaranteed that all the values of ai,j and bi,j are chosen uniformly at random from integers in [1,106]. The randomness condition does not apply to the sample test case, but your solution must pass the sample as well.
Output
For each test case, output a single line containing an integer: the maximum number of dollars you can earn by selling diamonds.
Sample Input
1
4
2 3 1 5
6 3 2 4
3 5 1 4
5 2 4 1
3 2 5 1
2 4 3 5
1 2 3 4
4 3 5 3
Sample Output
528
题目大意
在一个 \(n\times n\) 的网格内,每格有 \(a_{ij}\) 和 \(b_{ij}\)。从左上角 \((1,1)\) 走到右下角 \((n,n)\),每一步只能向下或者向右走。设路径上所有的 \(a_{ij}\) 之和为 \(sa\),\(b_{ij}\) 之和为 \(sb\),求 \(sa \times sb\) 的最大值。
算法思路
Beam Search(集束搜索)算法,设一个状态包含 \({x,y,sa,sb}\) ,且值为 \(sa\times sb\),记录每一个状态的前 \(k\) 大值,一直转移状态直到算出状态 \(x=N\) 且 \(y=N\) 的最大值。
用 vector 数组 BEAM 记录每一步的状态,状态限制数 \(MAXHASH\) 设为 \(50\)。
取每个状态的前 \(50\) 大值可以用大根堆来维护。限制状态需要用到数组hash_table记录当前状态数。
现在做法就很明确了,Beam Search代码如下。
点击查看代码
inline long long BEAM_SEARCH()
{
memset(hash_table,0,sizeof(hash_table));
BEAM.clear();
BEAM.push_back(STATE(1,1,a[1][1],b[1][1],(long long)a[1][1]*b[1][1]));
hash_table[make_hash(1,1)]=1;
register long long Max=0;
priority_queue<STATE>q;
while(BEAM.size()>0)
{
for(register int i=0;i<BEAM.size();++i)
{
int x=BEAM[i].x,y=BEAM[i].y;
int sa=BEAM[i].sa,sb=BEAM[i].sb;
if(x==N&&y==N)
{
Max=max(Max,BEAM[i].val);
continue;
}
if(y+1<=N)
{
q.push(STATE(x,y+1,sa+a[x][y+1],sb+b[x][y+1],(long long)(sa+a[x][y+1])*(sb+b[x][y+1])));
}
if(x+1<=N)
{
q.push(STATE(x+1,y,sa+a[x+1][y],sb+b[x+1][y],(long long)(sa+a[x+1][y])*(sb+b[x+1][y])));
}
}
int cnt=BEAM.size();
BEAM.clear();
while((!q.empty())&&BEAM.size()<=cnt*MAXHASH)
{
if(hash_table[make_hash(q.top().x,q.top().y)]<=MAXHASH)
{
BEAM.push_back(q.top());
hash_table[make_hash(q.top().x,q.top().y)]++;
}
q.pop();
}
}
return Max;
}
HDU 6981.Rise in Price (Beam Search 贪心)的更多相关文章
- Beam Search快速理解及代码解析
目录 Beam Search快速理解及代码解析(上) Beam Search 贪心搜索 Beam Search Beam Search代码解析 准备初始输入 序列扩展 准备输出 总结 Beam Sea ...
- 【NLP】选择目标序列:贪心搜索和Beam search
构建seq2seq模型,并训练完成后,我们只要将源句子输入进训练好的模型,执行一次前向传播就能得到目标句子,但是值得注意的是: seq2seq模型的decoder部分实际上相当于一个语言模型,相比于R ...
- 集束搜索beam search和贪心搜索greedy search
贪心搜索(greedy search) 贪心搜索最为简单,直接选择每个输出的最大概率,直到出现终结符或最大句子长度. 集束搜索(beam search) 集束搜索可以认为是维特比算法的贪心形式,在维特 ...
- 关于 Image Caption 中测试时用到的 beam search算法
关于beam search 之前组会中没讲清楚的 beam search,这里给一个案例来说明这种搜索算法. 在 Image Caption的测试阶段,为了得到输出的语句,一般会选用两种搜索方式,一种 ...
- Empirical Analysis of Beam Search Performance Degradation in Neural Sequence Models
Empirical Analysis of Beam Search Performance Degradation in Neural Sequence Models 2019-06-13 10:2 ...
- beam search 和 greedy search
贪心搜索(greedy search): 贪心搜索最为简单,直接选择每个输出的最大概率,直到出现终结符或最大句子长度. 集束搜索(beam search): 集束搜索可以认为是维特比算法的贪心形式,在 ...
- Beam Search快速理解及代码解析(下)
Beam Search的问题 先解释一下什么要对Beam Search进行改进.因为Beam Search虽然比贪心强了不少,但还是会生成出空洞.重复.前后矛盾的文本.如果你有文本生成经验,一定对这些 ...
- Beam Search快速理解及代码解析(上)
Beam Search 简单介绍一下在文本生成任务中常用的解码策略Beam Search(集束搜索). 生成式任务相比普通的分类.tagging等NLP任务会复杂不少.在生成的时候,模型的输出是一个时 ...
- Beam Search(集束搜索/束搜索)
找遍百度也没有找到关于Beam Search的详细解释,只有一些比较泛泛的讲解,于是有了这篇博文. 首先给出wiki地址:http://en.wikipedia.org/wiki/Beam_searc ...
- 关于Beam Search
Wiki定义:In computer science, beam search is a heuristic search algorithm that explores a graph by exp ...
随机推荐
- CPU 100%问题排查总结
更多内容,移步IT-BLOG 排查思路 [1]定位高负载进程 pid:登录进服务器使用 top 或 top -c命令[ps -ef | grep xxx 命令]查看当前 CPU消耗过高的进程,从而得到 ...
- TCP三次握手一二三问
下面整理下TCP握手和挥手的几个问题,参考资料小林图解计算机网络 1.什么是三次握手? Client端向Server端发送SYN为1的报文段,携带一个初始序列号x,client端进入SYN_SENT状 ...
- webgl 系列 —— 着色器语言
其他章节请看: webgl 系列 着色器语言 本篇开始学习着色器语言 -- GLSL全称是 Graphics Library Shader Language (图形库着色器语言) GLSL 是一门独立 ...
- Java高频面试题(2023最新整理)
Java的特点 Java是一门面向对象的编程语言.面向对象和面向过程的区别参考下一个问题. Java具有平台独立性和移植性. Java有一句口号:Write once, run anywhere,一次 ...
- 企业信息化-3.6 IT资源管理2-系统及应用
笔者从业的主要是App Dev&Ops,对操作系统有些了解,对应用软件了解的更多.以下是总结了以前跟Host&Server Service.Cloud Service.IT Solut ...
- 二进制安装Kubernetes(k8s) v1.23.3
声明:微信公众号不支持富文本格式,代码缩进有问题 参考我其他平台文档: https://www.oiox.cn/index.php/archives/90/ https://juejin.cn/pos ...
- LeeCode 318周赛复盘
T1: 对数组执行操作 思路:模拟 public int[] applyOperations(int[] nums) { int n = nums.length; for (int i = 0; i ...
- mysql迁移:xtrabackup迁移mysql5.7.32
问题描述:利用外部xtrabackup工具来做迁移mysql数据库,或者恢复数据库 xtrabackup迁移mysql 1.环境 mysql源库 mysql目标迁移库 IP 192.168.163.3 ...
- SSL CA 证书生成shell
gencert ssl证书生成 要保证Web浏览器到服务器的安全连接,HTTPS几乎是唯一选择.HTTPS其实就是HTTP over SSL,也就是让HTTP连接建立在SSL安全连接之上. SSL使用 ...
- 在Vue中使用键盘事件,回调函数被执行两次
暂时先不考虑v-for的key,查看下面的代码 <template> <div> <form @submit.prevent="addTask"> ...