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 ...
随机推荐
- 什么是UV贴图和展开?
转载:https://baijiahao.baidu.com/s?id=1673723122020029798&wfr=spider&for=pc UV贴图是用于轻松包装纹理的3D模型 ...
- salesforce零基础学习(一百二十五)零基础学习SF路径
本篇参考: https://boulder-bard-27f.notion.site/Salesforce-Learning-e990864695674f07b99a5f8955770bd4 本篇背景 ...
- 自己动手从零写桌面操作系统GrapeOS系列教程——24.加载并运行loader
学习操作系统原理最好的方法是自己写一个简单的操作系统. 之前我们在电脑的启动过程中介绍过boot程序的主要任务就是加载并运行loader程序,本讲我们就来实现. 本讲代码文件共2个: boot.asm ...
- Nmap学习
Nmap学习 一.主机发现 1.全面扫描/综合扫描 nmap -A 192.168.142.201 2.Ping扫描 nmap -sP 192.168.142.0/24 3.免Ping扫描,穿透防火墙 ...
- 团队如何选择合适的Git分支策略?
现代软件开发过程中要实现高效的团队协作,需要使用代码分支管理工具实现代码的共享.追溯.回滚及维护等功能.目前流行的代码管理工具,包括CVS,SVN,Git,Mercurial等. 相比CVS和SVN的 ...
- CentOS 落幕,将于2021年底结束维护
官方最新消息: 译文: CentOS项目的未来是CentOS Stream,明年,我们将把重点从重建Red Hat Enterprise Linux(RHEL)的CentOS Linux转移到Cent ...
- 多表查询和python操作mysql
目录 多表查询的两种方法 方法1:连表操作 方法2:子查询 小知识点补充说明 可视化软件NaviCat 多表查询练习题 1.查询所有的课程的名称以及对应的任课老师姓名 2.查询平均成绩大于八十分的同学 ...
- VMWare无法从主机向虚拟机复制粘贴
VMWare无法从主机向虚拟机复制粘贴 问题描述 无法在本机和虚拟机之间实现复制粘贴和文件拖到功能. 系统环境 本机 Windows10 虚拟机 Centos7 解决方法 多次尝试重新安装VMware ...
- 在有限 computational budget 下,借助 low-fidelity 模型提高精度
论文名称:context-aware learning of hierarchies of low-fidelity models for multi-fidelity uncertainty qua ...
- 帝国cms 随机调取新闻
<?php $hits_r = $empire->query("select * from {$dbtbpre}ecms_music as t1 join (select rou ...