zoukankan      html  css  js  c++  java
  • hdu 1078 FatMouse and Cheese(记忆化搜索)

    题意:一个n*n的矩阵,每个点有若干块点心,小老鼠开始在左上角,每次最多往前走k步,且停留的点的点心数比上一次停留的点大,输出最大的i点心数

    分析:停留的点数目必须比上次大,形成一个序,必定是一个DAG,那么dp[ix][y]表示从x,y出发得到的最大数量,如果已经搜索过x,y,直接返回dp[x][y]

    裸的记忆话搜索

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=105;
     4 const int dx[]={0,0,1,-1};
     5 const int dy[]={1,-1,0,0};
     6 int a[maxn][maxn],dp[maxn][maxn];
     7 int n,k;
     8 
     9 inline bool judge(int x,int y){
    10     return x>=0&&x<n&&y>=0&&y<n;
    11 }
    12 
    13 int dfs(int x,int y){
    14     if(dp[x][y])return dp[x][y];
    15     int t=0;
    16     for(int j=1;j<=k;j++)
    17     for(int i=0;i<4;i++){
    18         int nx=x+dx[i]*j;
    19         int ny=y+dy[i]*j;
    20         if(!judge(nx,ny))continue;
    21         if(a[nx][ny]>a[x][y])t=max(t,dfs(nx,ny));
    22     }
    23     return dp[x][y]=a[x][y]+t;
    24 }
    25 
    26 int main(){
    27     
    28     while(~scanf("%d%d",&n,&k)&&n>0&&k>0){
    29         for(int i=0;i<n;i++)
    30             for(int j=0;j<n;j++)
    31                 scanf("%d",&a[i][j]);
    32             
    33         memset(dp,0,sizeof(dp));
    34         printf("%d
    ",dfs(0,0));
    35         
    36     }
    37     return 0;
    38 }
    View Code
  • 相关阅读:
    分解质因数
    大素数测试和分解质因数
    快速幂
    欧拉函数
    素数
    gcd,lcm,ext_gcd,inv
    凸包问题 poj 2187
    map的 简单用法
    判断线段是否在园内
    2-sat 问题
  • 原文地址:https://www.cnblogs.com/jihe/p/6566919.html
Copyright © 2011-2022 走看看