HDU 1078

来源:互联网 发布:淘宝修改标题必须下架 编辑:程序博客网 时间:2024/06/16 00:00
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=1000;int n,k;int a[maxn][maxn],dp[maxn][maxn];int step[4][2]={1,0,-1,0,0,1,0,-1};int dfs(int x,int y){  int i,j,ans=0;//ans是每一个i,j位置上的记录状态以及从i,j出发能得到的最大搜索值。    if(!dp[x][y])    {        for(i=1;i<=k;i++)        {            for(j=0;j<4;j++)            {                int xx=x+step[j][0]*i;                int yy=y+step[j][1]*i;                if(xx<1||yy<1||xx>n||yy>n)                    continue;                if(a[xx][yy]>a[x][y])                {                    ans=max(ans,dfs(xx,yy));                }            }        }        dp[x][y]=ans+a[x][y];    }    return dp[x][y];}int main(){    while(scanf("%d%d",&n,&k)!=EOF)    {        if(n==-1&&k==-1)            break;        for(int i=1;i<=n;i++)        {            for(int j=1;j<=n;j++)                scanf("%d",&a[i][j]);        }        memset(dp,0,sizeof(dp));        printf("%d\n",dfs(1,1));    }    return 0;}
这是第一次接触到记忆化搜索,也从网上找来了一些资料来看,发现这个博客写的还是不错的,归纳了记忆化搜索的特点和其他的一些特性,还是比较有帮助的。
http://blog.csdn.net/urecvbnkuhbh_54245df/article/details/5847876
对于上面的这个问题,一开始不知道怎么做啊,所以也只能看解题报告了。


0 0
原创粉丝点击