dfs+dp思想的结合------hdu1078
首先是题目的意思:
从一个正方形的0,0点开始走,只能横着走,竖着走,最多走k步,下一个点的数一定要比当前这个点的值大,每走一步,就加上下一个点的数据,问数据最大能有多少。
首先遇到这种题目,走来走去的,一开始想到的是搜索,但是搜索我们搜的很多是路径,能走到那个点的最短路,但是这道题目不一样。
首先要注意的一点是,如果没有条件的搜索,那就是枚举。只有搜遍了才能得到最后的解。
1s题,只是搜的话肯定TLE了。
所以我们想到的自然就是dp了。dp的好处是什么?就是能减少不必要的搜索。用已知的结果减少当前路径搜索的时间。
几个要点:
1、只能从0,0开始走,所以已经减少了很多复杂了,不要傻乎乎的全部循环。
2、注意dfs时候的边界判断。
3、更新值时不要忘记加上当前自己的值。
状态转移方程
dp[][] = max(所有可以从当前点走到的点的dfs的结果集)
初始值肯定是0没问题
最后dp【0】【0】就是结果了。
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm> using namespace std;
/*dfs+dp,hdu1078*/ int maps[][];//用来保存原数据
int dp[][];//dp数组
int k;//最多走的步数
int n;//区域大小 int update(int x,int y)
{
int i,j;
int fromX,toX;
int fromY,toY;
int maxTemp=;
int temp; //判断边界条件
if(dp[x][y])
return dp[x][y]; if(x-k < )
fromX = ;
else
fromX = x-k; if(x+k >= n)
toX = n-;
else
toX = x+k; if(y-k < )
fromY = ;
else
fromY = y-k; if(y+k >= n)
toY = n-;
else
toY = y+k; for (i = fromX; i <= toX; i++)
{
if(i!=x && maps[i][y] > maps[x][y])
{
temp = update(i,y);
if(temp > maxTemp)
maxTemp = temp;
}
} for (j = fromY; j <= toY; j++)
{
if(j!=y && maps[x][j] > maps[x][y])
{
temp = update(x,j);
if(temp > maxTemp)
maxTemp = temp;
}
} dp[x][y] = maxTemp + maps[x][y];
return dp[x][y];
} int main()
{
int i,j;//循环变量
int maxNumber=;//记录结果 while (true)
{
cin>>n>>k;
if(n==- && k==-)
break;
memset(dp,,sizeof(dp));
//输入数据
for (i = ; i < n; i++)
for (j = ; j < n; j++)
cin>>maps[i][j]; //只能从0.0点开始走
maxNumber = update(,); cout<<maxNumber<<endl;
} return ;
}
dfs+dp思想的结合------hdu1078的更多相关文章
- 到底什么是dp思想(内含大量经典例题,附带详细解析)
期末了,通过写博客的方式复习一下dp,把自己理解的dp思想通过样例全部说出来 说说我所理解的dp思想 dp一般用于解决多阶段决策问题,即每个阶段都要做一个决策,全部的决策是一个决策序列,要你求一个 最 ...
- HDU1978How Many Ways 记忆化dfs+dp
/*记忆化dfs+dp dp[i][j]代表达到这个点的所有路的条数,那么所有到达终点的路的总数就是这dp[1][1]加上所有他所能到达的点的 所有路的总数 */ #include<stdio. ...
- hdu 3030 Increasing Speed Limits (离散化+树状数组+DP思想)
Increasing Speed Limits Time Limit: 2000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java ...
- 记忆化搜索(DFS+DP) URAL 1223 Chernobyl’ Eagle on a Roof
题目传送门 /* 记忆化搜索(DFS+DP):dp[x][y] 表示x个蛋,在y楼扔后所需要的实验次数 ans = min (ans, max (dp[x][y-i], dp[x-1][i-1]) + ...
- 记忆化搜索(DFS+DP) URAL 1501 Sense of Beauty
题目传送门 /* 题意:给了两堆牌,每次从首部取出一张牌,按颜色分配到两个新堆,分配过程两新堆的总数差不大于1 记忆化搜索(DFS+DP):我们思考如果我们将连续的两个操作看成一个集体操作,那么这个操 ...
- DP思想在斐波那契数列递归求解中的应用
斐波那契数列:1, 1, 2, 3, 5, 8, 13,...,即 f(n) = f(n-1) + f(n-2). 求第n个数的值. 方法一:迭代 public static int iterativ ...
- 【cf1111】C. Creative Snap (dfs+dp)
传送门 简单的dfs+dp即可解决.根本不用动态开点 /* * Author: heyuhhh * Created Time: 2019/11/13 10:12:42 */ #include < ...
- HDU1078 FatMouse and Cheese(DFS+DP) 2016-07-24 14:05 70人阅读 评论(0) 收藏
FatMouse and Cheese Problem Description FatMouse has stored some cheese in a city. The city can be c ...
- hdu1078 dfs+dp(记忆化搜索)搜索一条递增路径,路径和最大,起点是(0,0)
#include<bits/stdc++.h> using namespace std; typedef unsigned int ui; typedef long long ll; ty ...
随机推荐
- AJAx 刷新页面
<html><head> <meta http-equiv="Content-Type" content="text/html; chars ...
- The Linux Storage Stack Diagram 内核 4.0 版的 I/O 栈
- Django 基础知识
Django Models django 本身提供了非常强大易使用的ORM组件,并且支持多种数据库,如sqllite,mysql,progressSql,Oracle等,当然最常用的搭配还是mysql ...
- C Runtime Library来历, API, MFC, ATL关系
首先说明,我google了半天,想找到英文的关于这个资料,但是实在找不到,只好转载国人的讨论. CRT原先是指Microsoft开发的C Runtime Library,用于操作系统的开发及运行.后来 ...
- 在Scholarspace可视化交互式分析中遇到的几个问题及处理方法
1 JavaScript中的变量作用范围 JS中的变量作用域是以函数为单位的,因为在两个for循环中,不能用同一个变量命名作为循环的控制条件,不然会陷入死循环退出不来.曾经为了处理这个问题花看一天的时 ...
- 复习TextView(查漏补缺)
android:drawableLeft="@drawable/ic_launcher"----设置图片居左 android:paddingLeft="20dp" ...
- HDU 3452 Bonsai
可以转化成最小割的求解,题目其实就是要求把点分成两个集合,增加一个超级汇点,一部分的点在根节点所在集合内,一部分节点在超级汇点所在的集合内,这两就分开了,又要求费用最小,那么就是最小割. #inclu ...
- 巧用weui.topTips验证数据
场景一.有一个输入金额的场景,这个金额需要验证,验证说明如下: 不能为空格: 不能为0: 不能为汉字: 不能为其它字符: 不能大于200: 唯一可以的是,只有输入3~199之间的数字,下面的确定按钮才 ...
- Codeforces Round #354 (Div. 2)_Vasya and String(尺取法)
题目连接:http://codeforces.com/contest/676/problem/C 题意:一串字符串,最多改变k次,求最大的相同子串 题解:很明显直接尺取法 #include<cs ...
- hdu_1253_胜利大逃亡(bfs+剪枝)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1253 题意:三维BFS,不解释 题解:DFS+剪枝会超时,裸BFS会超时,BFS+剪枝才能AC,有点伤 ...