uva 10913 - Walking on a Grid

最后一个数(n,n)是负数的情况

改掉即可ac

#include <iostream>

#include<cstdio>

#include<cstring>

#define INF 100000000000

#define N 80

using namespace std;

bool vis[N][N][10][3];

long long dp[N][N][10][3];

long long n,k,cas=1;

long long mat[N][N];

long long dx[3]={0,0,1};

long long dy[3]={-1,1,0};

bool ok(long long i)

{

    return i>=0&&i<n;

}

long long DP(long long i,long long j,long long k,long long d)

{

    long long &m=dp[i][j][k][d];

    if(vis[i][j][k][d])

    return m;

    vis[i][j][k][d]=true;



    if(k==0&&mat[i][j]<0)

    return -INF;



    if(i==n-1&&j==n-1)

    return m=mat[i][j];





    long long x,y;

    if(mat[i][j]<0)

    k--;

    //不是从右面来的,可以向右走

    if(d!=1)

    {

        x=i+dx[1],y=j+dy[1];

        if(ok(x)&&ok(y))

        {

            DP(x,y,k,0);

            if(dp[x][y][k][0]!=-INF)

            m=max(m,dp[x][y][k][0]+mat[i][j]);

        }

    }

    //不是从左面来的,可以向左走

    if(d!=0&&i!=n-1)

    {

        x=i+dx[0],y=j+dy[0];

        if(ok(x)&&ok(y))

        {

            DP(x,y,k,1);

            if(dp[x][y][k][1]!=-INF)

            m=max(m,dp[x][y][k][1]+mat[i][j]);

        }

    }

    if(i!=n-1)

    {

        x=i+1,y=j;

        DP(x,y,k,2);

        if(dp[x][y][k][2]!=-INF)

        m=max(m,dp[x][y][k][2]+mat[i][j]);

    }

    return m;

}

int main()

{

    while(scanf("%lld%lld",&n,&k),n+k)

    {

        for(long long i=0;i<n;i++)

        for(long long j=0;j<n;j++)

        {

            scanf("%lld",&mat[i][j]);

            for(long long t=0;t<=k;t++)

            dp[i][j][t][0]=dp[i][j][t][1]=dp[i][j][t][2]=-INF;

        }

        memset(vis,false,sizeof(vis));

        DP(0,0,k,0);

        printf("Case %lld: ",cas++);

        if(dp[0][0][k][0]!=-INF)

        printf("%lld\n",dp[0][0][k][0]);

        else

        puts("impossible");

    }

    return 0;

}

  

你可能感兴趣的:(grid)