方格取数

时间:2014-08-10 18:45:20   收藏:0   阅读:274

题目链接

const int MAXN = 110;

int dp[2][MAXN][MAXN], ipt[MAXN][MAXN];
int n;

inline bool check(int x)
{
    return x >= 0 && x < n;
}

inline void Max(int step, int now, int x, int xx, int tx, int txx)
{
    int ty = step + 1 - tx, tyy = step + 1 - txx;
    if (!check(tx) || !check(ty) || !check(txx) || !check(tyy))
        return;
    if (step != n + n - 3 && tx == txx && ty == tyy)
        return;
    int val = dp[now][x][xx] + ipt[tx][ty] + ipt[txx][tyy];
    if (dp[now ^ 1][tx][txx] < val)
        dp[now ^ 1][tx][txx] = val;
}

int main()
{
    while (~RI(n))
    {
        REP(i, n) REP(j, n)
            RI(ipt[i][j]);
        if (n == 1)
        {
            WI(ipt[0][0]);
            continue;
        }
        int step = n + n - 2, now = 0;
        CLR(dp, -1); dp[now][0][0] = ipt[0][0];
        REP(s, step)
        {
            REP(i, n) REP(j, n)
            {
                int x = i, y = s - i, xx = j, yy = s - j;
                if (!check(x) || !check(y) || !check(xx) | !check(yy) || !~dp[now][x][xx])
                    continue;
                Max(s, now, i, j, i, j);
                Max(s, now, i, j, i + 1, j);
                Max(s, now, i, j, i, j + 1);
                Max(s, now, i, j, i + 1, j + 1);
            }
            CLR(dp[now], -1);
            now ^= 1;
        }
        cout << dp[now][n - 1][n - 1] - ipt[n - 1][n - 1] << endl;
    }
    return 0;
}


方格取数,布布扣,bubuko.com

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!