uva_10913 - Walking on a Grid( 普通DP )

来源:互联网 发布:什么软件打开psd 编辑:程序博客网 时间:2024/05/17 20:22
想对了状态,结果超时,原来还需要另外一个数组标记是否访问过的状态: dp[x][y][k][d] 表示到大(x,y)最多踏上k个负数方格且由前一个经过d的方向过来的状态转移: dp[x][y][k][d] = max(dp[x][y][k'][d']) 保证 d'不与d相对,k根据当前方格的数值而定#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define DIM     2#define DIR     3#define MAXK    6#define MAXN    76int n, val[MAXN][MAXN], visit[MAXN][MAXN][MAXK][DIR];int dir[][DIM] = {        {0, -1}, {0, 1}, {1, 0}};long long dp[MAXN][MAXN][MAXK][DIR], INF;long long dfs(int x, int y, int k, int d){        int cur_k( k );        cur_k -= ((val[x][y] < 0)? 1 : 0);        if( cur_k < 0 ) {                return INF;        }        if( visit[x][y][k][d] ) {                return dp[x][y][k][d];        }        if( x == n && y == n ) {                visit[x][y][k][d] = 1;                return dp[x][y][k][d] = val[x][y];        }        int tx, ty;        long long rst(INF);        for(int i = 0; i < DIR; i ++) {                if( 1 == (d+i) ) {                        continue;                }                tx = x+dir[i][0]; ty = y+dir[i][1];                if( tx < 1 || ty < 1 || tx > n || ty > n )  {                        continue;                }                if( INF != dfs(tx, ty, cur_k, i) ) {                        rst = max(rst, val[x][y]+dp[tx][ty][cur_k][i]);                }        }        visit[x][y][k][d] = 1;        return dp[x][y][k][d] = rst;}int main(int argc, char const *argv[]){#ifndef ONLINE_JUDGE        freopen("test.in", "r", stdin);#endif        long long rst;        int cas(1), max_k, x, y;        while( scanf("%d %d", &n, &max_k) ) {                if( !n && !max_k ) {                        break;                }                for(int i = 1; i <= n; i ++) {                        for(int j = 1; j <= n; j ++) {                                scanf("%d", &val[i][j]);                        }                }                if( 1 == n && max_k < 0 ) {                        printf("Case %d: impossible\n", cas ++); continue;                }                if( 1 == n ) {                        printf("Case %d: %d\n", cas ++, val[1][1]); continue;                }                memset(visit, 0, sizeof(visit));                memset(dp, -0x3F, sizeof(dp)); rst = INF = dp[0][0][0][0];                if( INF != dfs(1, 1, max_k, 1) ) {                        rst = max(rst, dfs(1, 1, max_k, 1));                }                if( INF != rst ) {                        printf("Case %d: %lld\n", cas ++, rst); continue;                }                printf("Case %d: impossible\n", cas ++);        }        return 0;}