dfs,,类似树的想法

来源:互联网 发布:库里生涯场均数据 编辑:程序博客网 时间:2024/04/28 08:03

P - FatMouse and Cheese

 HDU - 1078 

看了是dfs。但是自己写的时候没有按照那个写。。

而且题目还没看好。他是只能水平或垂直,不能再转向了。。

别人ac代码:

#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;int n,k,dp[105][105],a[105][105];int to[4][2] = {1,0,-1,0,0,1,0,-1};int check(int x,int y){    if(x<1 || y<1 || x>n || y>n)        return 1;    return 0;}int dfs(int x,int y){    int i,j,l,ans = 0;    if(!dp[x][y])    {        for(i = 1; i<=k; i++)        {            for(j = 0; j<4; j++)            {                int xx = x+to[j][0]*i;                int yy = y+to[j][1]*i;                if(check(xx,yy))                    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(){    int i,j;    while(~scanf("%d%d",&n,&k),n>0&&k>0)    {        for(i = 1; i<=n; i++)            for(j = 1; j<=n; j++)                scanf("%d",&a[i][j]);        memset(dp,0,sizeof(dp));        printf("%d\n",dfs(1,1));//他的dp[i][j]表示从(ii,j)走得到的maxx,算是一种逆向思维吧,而且因为dfs(1,1)是确定的。这更像是一种树的结构。    }    return 0;}
自己的TLE代码。  没有什么参考价值吧。

#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#include<string>#include<cstring>#include<iomanip>#include<iostream>#include<stack>#include<cmath>#include<map>#include<vector>#define ll long long#define inf 0x3f3f3f3f#define bug1 cout<<"bug1"<<endl;#define bug2 cout<<"bug2"<<endl;#define bug3 cout<<"bug3"<<endl;using namespace std;const int maxn=105;int a[maxn][maxn];int dp[maxn][maxn];int n,k;void dfs(int x,int y){//对于每一个点都找出它的上一个。    int tmpu=max(0,x-k),tmpd=min(n,x+k+1);    for(int i=tmpu;i<tmpd;++i){        int tmpl=max(y-k,0),tmpr=min(n,y+k+1);        for(int j=tmpl;j<tmpr;++j){            if(abs(x-i)+abs(y-j)<=k){                if(dp[i][j]<dp[x][y]+a[i][j]&&a[i][j]>a[x][y]){                    dp[i][j]=dp[x][y]+a[i][j];                    dfs(i,j);                }                /*                if(dp[i][j]+a[x][y]>dp[x][y]&&a[i][j]<a[x][y]){                    dfs(i,j);                    dp[x][y]=dp[i][j]+a[x][y];                }                */                /*  反正由前一个状态到这个状态是不可以的                if(dp[i][j]+a[x][y]>dp[x][y]){                    dp[x][y]=dp[i][j]+a[x][y];                }                */                /*                if(dp[i][j]<dp[x][y]+a[i][j]&&a[i][j]>a[x][y]){                    dp[i][j]=dp[x][y]+a[i][j];                }*///有当前推后面也不可以            }        }    }}void init(){    memset(dp,0,sizeof(dp));}int main(){    while(~scanf("%d%d",&n,&k)&&n!=-1&&k!=-1){        init();        for(int i=0;i<n;++i){            for(int j=0;j<n;++j){                scanf("%d",&a[i][j]);            }        }        /*        for(int i=0;i<n;++i){            for(int j=0;j<n;++j){                cout<<a[i][j]<<' ';            }            cout<<'\n';        }*/        dp[0][0]=a[0][0];        for(int i=0;i<n;++i){            for(int j=0;j<n;++j){                dfs(i,j);            }        }        for(int i=n-1;i>=0;--i){            for(int j=n-1;j>=0;--j){                dfs(i,j);            }        }        /*        for(int i=0;i<n;++i){            for(int j=0;j<n;++j){                dfs(i,j);            }        }        for(int i=n-1;i>=0;--i){            for(int j=n-1;j>=0;--j){                dfs(i,j);            }        }*/        int maxx=0;        for(int i=0;i<n;++i){            for(int j=0;j<n;++j){                maxx=max(maxx,dp[i][j]);            }        }        /*        for(int i=0;i<n;++i){            for(int j=0;j<n;++j){                cout<<dp[i][j]<<' ';            }            cout<<'\n';        }*/        cout<<maxx<<'\n';    }}



0 0
原创粉丝点击