zoukankan      html  css  js  c++  java
  • hdu1078  记忆化搜索(DP+DFS)

    题意:一张n*n的格子表格,每个格子里有个数,每次能够水平或竖直走k个格子,允许上下左右走,每次走的格子上的数必须比上一个走的格子的数大,问最大的路径和。

    我一开始的思路是,或许是普通的最大路径和,只是多了可以一次走k个格子这个条件而已,终于能够水过了呢!

    紧接着我发现,不止能向左和下走,还可以往回走!这就不能用 for(i=0;i<n;i++)  for(j=0;j<n;j++) 这样的两个循环 dp 掉整个图了,因为当我更新完后面的点可能又会走回来。

    并想不到 DFS 的我想到了我是否可以把所有点按数的大小排序,按顺序 dp 就不会有往回去的问题了,而且我还担心如果一开始给的第一个点要是本来就很大,那有可能后面给的点比它小那我就连读都不用读它了我好机制!后来才知道我简直蠢成马对的就是这样,如我所料的TLE了```

    看了题解的我眼泪掉下来```DFS+DP还是写题解的巨巨们玩的溜啊,我显然没有想过这么优质的做法```DFS里对每一条可能的路径都会遍历一遍,用 if ( ! dp [x] [y] ) 避免了一些重复判断的情况,在跑 DFS 的过程中连我那机制的读取数据都省了,能给我留点面子嘛```记忆化搜索毕竟还是比我溜很多的

    后来问了学长这题还有没有其他的解法,学长表示,可以预处理出可能的路径,通过两点之间横竖距离小于等于 k 个格子以及数的递增建立一个有向图,然后用 DAG 做,但是由于本来就给了一个有距离关系的图,又重新做一个图显然会慢,学长还是比我机智几个档次的~

    就这样,又学了一个记忆化搜索~

     1 #include<stdio.h>
     2 #include<string.h>
     3 #define max(a,b) a>b?a:b
     4 using namespace std;
     5 int dp[101][101],a[101][101],k,n;
     6 
     7 int xx[4]={1,-1,0,0};
     8 int yy[4]={0,0,1,-1};
     9 
    10 int dfs(int x,int y){
    11     int ans=0,m=0;
    12     if(!dp[x][y]){
    13         for(int i=1;i<=k;i++){
    14             for(int j=0;j<=3;j++){
    15                 int dx=x+i*xx[j],dy=y+i*yy[j];
    16                 if(dx>=0&&dx<n&&dy>=0&&dy<n&&a[dx][dy]>a[x][y]){
    17                     m=max(m,dfs(dx,dy));
    18                 }
    19             }
    20         }
    21         dp[x][y]=m+a[x][y];
    22     }
    23     return dp[x][y];
    24 }
    25 
    26 int main(){
    27     while(scanf("%d%d",&n,&k)!=EOF&&(n!=-1||k!=-1)){
    28         memset(dp,0,sizeof(dp));
    29         int i,j;
    30         for(i=0;i<n;i++){
    31             for(j=0;j<n;j++){
    32                 scanf("%d",&a[i][j]);
    33             }
    34         }
    35         int ans=dfs(0,0);
    36         printf("%d
    ",ans);
    37     }
    38     return 0;
    39 }
    View Code
  • 相关阅读:
    性能测试指标
    性能优化——存储性能优化
    装背包 --- 深度优先搜索时间复杂度 ... 线性搜索
    深度优先搜索之偏爱时间复杂度
    Oh,mygoddess
    优先队列 + 并查集 + 字典树 + 欧拉回路 + 树状数组 + 线段树 + 线段树点更新 + KMP +AC自动机 + 扫描线
    Nightmare --- 炸弹时间复位
    3Ddungeon-------三维搜索-----偷个懒 把 亡命逃窜 的代码修改了一下 拿来用了
    迷宫寻宝(一) ---- 状态压缩
    NYOJ999 师傅又被妖怪抓走了
  • 原文地址:https://www.cnblogs.com/cenariusxz/p/4287245.html
Copyright © 2011-2022 走看看