Leetcode Dungeon Game(经典动态规划)

来源:互联网 发布:2016淘宝域名怎么设置 编辑:程序博客网 时间:2024/05/20 13:19

class Solution {public:    int calculateMinimumHP(vector<vector<int> > &dungeon) {        int n = dungeon.size();        if(n <= 0){            return 0;        }        int m = dungeon[0].size();        if(m <= 0){            return 0;        }        int f[2][m];        f[(n-1) & 1][m - 1] = dungeon[n - 1][m - 1];        for(int j = m - 2; j >= 0; j--){            f[(n-1) & 1][j] = dungeon[n - 1][j] + min(0, f[(n-1) & 1][j + 1]);         }        for(int i = n - 2; i >= 0; i--){            f[i & 1][m - 1] =  dungeon[i][m - 1] + min(0, f[i & 1 ^ 1][m - 1]);            for(int j = m - 2; j >= 0; j--){                f[i & 1][j] = dungeon[i][j] + min(0, max(f[i & 1 ^ 1][j],f[i & 1][j + 1]));            }        }        return 1 + (f[0][0] >0 ? 0 : abs(f[0][0]));    }};

如果允许修改dungeon数组,那么我们甚至可以得到一个O(1)空间的解决方案


class Solution {public:    int calculateMinimumHP(vector<vector<int> > &dungeon) {        int n = dungeon.size();        if(n <= 0){            return 0;        }        int m = dungeon[0].size();        if(m <= 0){            return 0;        }        for (int i = n - 1; i >= 0; i--) {            for (int j = m - 1; j >= 0; j--) {                bool rowEnd = i == n - 1;                bool columnEnd = j == m - 1;                if (!rowEnd && !columnEnd) {                    dungeon[i][j] += max(dungeon[i + 1][j], dungeon[i][j + 1]);                } else if (rowEnd ^ columnEnd) {                    dungeon[i][j] += dungeon[i + (rowEnd ? 0 : 1)][j + (columnEnd ? 0 : 1)];                }                dungeon[i][j] *= !(dungeon[i][j] > 0);            }        }        return abs(dungeon[0][0]) + 1;    }};







0 0
原创粉丝点击