HDU4571 记忆化搜索

2024-06-20 04:38
文章标签 搜索 记忆 hdu4571

本文主要是介绍HDU4571 记忆化搜索,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2013 ACM-ICPC长沙赛区全国邀请赛

n个城市,m条路,总时间t,起始城市s,终点城市e

接下来给出各个城市的浏览时间,各个城市浏览后的满意程度。然后是m条路的信息。要求一个浏览顺序,使得总的满意程度最大,然后经过一个城市可以选择不去浏览,当前浏览城市的满意度一定要比前一个浏览城市的满意度高,并且最终要回到城市e。

floyd+记忆化搜索


#include "stdio.h"
#include "string.h"
#include "math.h"int inf=1000000000;
int cost[101],value[101];
int dis[101][101];
int dp[101][101][301];
int s,e,n;int Max(int a,int b)
{if (a<b) return b; else return a;
}
int dfs(int s,int v,int t)
{int i,ans;if (dis[s][e]>t) return -inf;if (dp[s][v][t]!=-1) return dp[s][v][t];ans=0;for (i=0;i<n;i++){if (dis[s][i]+cost[i]>t) continue;if (value[i]<=v) continue;ans=Max(ans,dfs(i,value[i],t-dis[s][i]-cost[i])+value[i]);}dp[s][v][t]=ans;return ans;
}void floyd()
{int i,j,l;for (i=0;i<n;i++)for (j=0;j<n;j++)for (l=0;l<n;l++)if (dis[j][i]+dis[i][l]<dis[j][l])dis[j][l]=dis[j][i]+dis[i][l];}int main()
{int Case,ii,m,t,i,j,a,b,c;scanf("%d",&Case);for (ii=1;ii<=Case;ii++){scanf("%d%d%d%d%d",&n,&m,&t,&s,&e);for (i=0;i<n;i++)scanf("%d",&cost[i]);for (i=0;i<n;i++)scanf("%d",&value[i]);for (i=0;i<n;i++)for (j=0;j<n;j++)if (i==j) dis[i][j]=0;elsedis[i][j]=inf;for (i=1;i<=m;i++){scanf("%d%d%d",&a,&b,&c);if (c<dis[a][b])dis[a][b]=dis[b][a]=c;}floyd();memset(dp,-1,sizeof(dp));printf("Case #%d:\n",ii);printf("%d\n",dfs(s,0,t));}return 0;
}




这篇关于HDU4571 记忆化搜索的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1077128

相关文章

【文末附gpt升级秘笈】腾讯元宝AI搜索解析能力升级:千万字超长文处理的新里程碑

腾讯元宝AI搜索解析能力升级:千万字超长文处理的新里程碑 一、引言 随着人工智能技术的飞速发展,自然语言处理(NLP)和机器学习(ML)在各行各业的应用日益广泛。其中,AI搜索解析能力作为信息检索和知识抽取的核心技术,受到了广泛的关注和研究。腾讯作为互联网行业的领军企业,其在AI领域的探索和创新一直走在前列。近日,腾讯旗下的AI大模型应用——腾讯元宝,迎来了1.1.7版本的升级,新版本在AI搜

代码随想录算法训练营第三十九天|62.不同路径 63. 不同路径 II 343.整数拆分 96.不同的二叉搜索树

LeetCode 62.不同路径 题目链接:62.不同路径 踩坑:二维的vector数组需要初始化,否则会报错访问空指针 思路: 确定动态数组的含义:dp[i][j]:到达(i,j)有多少条路经递推公式:dp[i][j] = dp[i-1][j] + dp[i][j-1]初始化动态数组:dp[0][0] = 1遍历顺序:从左到右,从上到下 代码: class Solution {pu

leetcode刷题(45)——35. 二叉搜索树的最近公共祖先

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5] 示例 1: 输入: root = [

【智能优化算法改进策略之局部搜索算子(五)—自适应Rosenbrock坐标轮换法】

1、原理介绍 作为一种有效的直接搜索技术,Rosenbrock坐标轮换法[1,2]是根据Rosenbrock著名的“香蕉函数”的特点量身定制的,该函数的最小值位于曲线狭窄的山谷中。此外,该方法是一种典型的基于自适应搜索方向集的无导数局部搜索技术。此法于1960年由Rosenbrock提出,它与Hooke-Jeeves模式搜索法有些类似,但比模式搜索更为有效。每次迭代运算分为两部分[3]: 1)

Day59 代码随想录打卡|二叉树篇---把二叉搜索树转换为累加树

题目(leecode T538): 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提醒一下,二叉搜索树满足下列约束条件: 节点的左子树仅包含键 小于 节点键的节点。节点的右子树仅包含键 大于 节点键的节点。左右子树也必须是二叉搜索树。 方法:本题

智能优化算法改进策略之局部搜索算子(六)--进化梯度搜索

1、原理介绍     进化梯度搜索(Evolutionary Gradient Search, EGS)[1]是兼顾进化计算与梯度搜索的一种混合算法,具有较强的局部搜索能力。在每次迭代过程中,EGS方法首先用受进化启发的形式估计梯度方向,然后以最陡下降的方式执行实际的迭代步骤,其中还包括步长的自适应,这一过程的总体方案如下图所示:     文献[1]

yii2 模糊搜索,使索引生效

$str1 = ‘名称’; $str2 = ‘描述’; Course::find() // %这样放,可以使name索引(设置了索引的话。同时false不能删掉,否则索引失效)生效 ->where([‘LIKE’, ‘name’, $str1.’%’, false]) ->andWhere([‘status’=>1]) // %这样放,可以使desc索引(设置了索引的话。同时false不能删掉,否

openjudge_2.5基本算法之搜索_8783:单词接龙

概要 8783:单词接龙 总时间限制: 1000ms 内存限制: 65536kB 描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含

智能优化算法改进策略之局部搜索算子(三)—二次插值法

1、原理介绍 多项式是逼近函数的一种常用工具。在寻求函数极小点的区间(即寻查区间)上,我们可以利用在若干点处的函数值来构成低次插值多项式,用它作为求极小点的函数的近似表达式,并用这个多项式的极小点作为原函数极小点的近似。低次多项式的极小点比较容易计算。常用的插值多项式为二次或三次,一般说来三次插值公式的收敛性好一些,但在导数不变计算时,三点二次插值也是一种常用的方法[1]。 3

C语言实现简单二分搜索和四个变体问题

二分查找 简单的二分查找 简单指的是在不存在重复元素的数组中,查找值等于给定值的情况。 int bsearch(int *arr, int n, int value){int low = 0;int high = n - 1;int mid;while (low <= high){mid = low + ((high-low) >> 1);if (arr[mid] == value){re