POJ 1088 DP || 记忆化搜索

2024-06-20 04:38
文章标签 poj 1088 dp 搜索 记忆

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

按高度从小到大排序一遍   DP即可:


#include "stdio.h"
#include "string.h"
#include "queue"
#include "algorithm"
using namespace std;int dir[4][2]={1,0,-1,0,0,1,0,-1};
int n,m,Min,ans;
int a[101][101],dp[101][101];struct node
{int x,y,h;
}data[10010];bool cmp(const node a,const node b)
{return a.h<b.h;
}
void bfs()
{int sum,i,j,x,y;sum=0;for (i=1;i<=n;i++)for (j=1;j<=m;j++){data[sum].x=i;data[sum].y=j;data[sum].h=a[i][j];sum++;}sort(data,data+sum,cmp);for (i=0;i<sum;i++){for (j=0;j<4;j++){x=data[i].x+dir[j][0];y=data[i].y+dir[j][1];if (x<1 || x>n || y<1 || y>m) continue;if (a[x][y]<=a[data[i].x][data[i].y]) continue;dp[x][y]=max(dp[x][y],dp[data[i].x][data[i].y]+1);}}
}int main()
{int i,j;while (scanf("%d%d",&n,&m)!=EOF){Min=10010;for (i=1;i<=n;i++)for (j=1;j<=m;j++){scanf("%d",&a[i][j]);dp[i][j]=1;}bfs();ans=1;for (i=1;i<=n;i++)for (j=1;j<=m;j++)if (dp[i][j]>ans) ans=dp[i][j];printf("%d\n",ans);}return 0;
}



裸记忆化搜索:

<pre name="code" class="cpp">#include "stdio.h"
#include "string.h"
int dir[4][2]={1,0,-1,0,0,1,0,-1};
int n,m;
int dp[101][101];
int a[101][101];
int M(int a,int b)
{if (a<b) return b;else return a;
}
int  bfs(int x,int y)
{int ans,i;if (x<1 || x>n || y<1 || y>m) return -1;if (dp[x][y]!=-1) return dp[x][y];ans=1;for (i=0;i<4;i++){if (x+dir[i][0]<1 || x+dir[i][0]>n || y+dir[i][1]<1 || y+dir[i][1]>m) continue;if (a[x][y]<=a[x+dir[i][0]][y+dir[i][1]]) continue;ans=M(ans,bfs(x+dir[i][0],y+dir[i][1])+1);}dp[x][y]=ans;return ans;
}
int main()
{int Max,i,ans,j;while (scanf("%d%d",&n,&m)!=EOF){Max=0;for (i=1;i<=n;i++)for (j=1;j<=m;j++){scanf("%d",&a[i][j]);if (a[i][j]>Max) Max=a[i][j];}memset(dp,-1,sizeof(dp));ans=1;for (i=1;i<=n;i++)for (j=1;j<=m;j++){ans=M(bfs(i,j),ans);}printf("%d\n",ans);}return 0;
}



                                    

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



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

相关文章

【文末附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

上海邀请赛 A题目 HDU 5236(dp)

先求出没有ctrl+s的时候构造长度为i的期望f[i] 。然后枚举保存的次数,求出最小即可。 #include<cstdio>#include<cstdio>#include<cmath>#include<queue>#include<stack>#include<string>#include<cstring>#include<iostream>#include<map>

poj 3882(Stammering Aliens) 后缀数组 或者 hash

后缀数组:  构建后缀数组,注意要在字符串莫末尾加上一个没出现过的字符。然后可以2分或者直接扫描,直接扫描需要用单调队列来维护 VIEW CODE #include<cstdio>#include<algorithm>#include<iostream>#include<cmath>#include<queue>#include<stack>#include<string

poj 3294(Life Forms) 2分+ 后缀数组

我曾用字符串hash写,但是超时了。只能用后最数组了。大致思路:用不同的符号吧字符串连接起来,构建后缀数组,然后2分答案,依次扫描后缀数组,看是否瞒住条件。 VIEW CODE #include<cstdio>#include<vector>#include<cmath>#include<algorithm>#include<cstring>#include<cassert>#

poj 2391 Ombrophobic Bovines (网络流)

这是一道很经典的网络流的题目。首先我们考虑假如我们的时间为无穷大。我们吧每个点拆成2个点 i和i' .。虚拟源点s和汇点t。对于每个点建边(s,i, a[i])  (i‘,t,ib[i]) 。 其中a[i]为给点有多少牛,b[i]为容量。i和j连通 建边 (i,j',inf);如果最大流==所有牛的个数,就可能装下所有的牛。那么现在我们考虑时间。假设最大时间为T.那么如果i到j的的最短时间>T

poj 1330 LCA 最近公共祖先

水题目。直接上代码了。 VIEW CODE #include<cstdio>#include<algorithm>#include<iostream>#include<cmath>#include<queue>#include<stack>#include<string>#include<cstring>#include<map>#include<vector>#

poj 3160 Father Christmas flymouse 强连通+dp

首先我们可以确定的是,对于val值小于0的节点都变成0.   假设一个集合内2个房间都能任意到达,那么我就可以吧集合内的所有点的价值都取到,并且可以达到任一点。实际上集合内的每个点是相同的,这样的集合就是一个强连通分量。 那么我们就可以用tarjin算法进行强连通缩点, 最后形成一个dag的图。在dag的图上面进行dp。可以先用拓扑排序后dp。或者建反响边记忆化搜索 。 VIEW

秋招突击——6/22——复习{区间DP——加分二叉树,背包问题——买书}——新作{移除元素、实现strStr()}

文章目录 引言复习区间DP——加分二叉树个人实现 背包问题——买书个人实现参考实现 新作移除元素个人实现参考思路 找出字符串中第一个匹配项的下标个人实现参考实现 总结 引言 今天做了一个噩梦,然后流了一身汗,然后没起来,九点多才起床背书。十点钟才开始把昨天那道题题目过一遍,然后十一点才开始复习题目,为了不耽误下午的时间,所以这里的就单纯做已经做过的题目,主打一个有量,不在学

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 = [