leecode第一百七十四题(地下城游戏)

class Solution {
public:
    int calculateMinimumHP(vector<vector<int>>& dungeon) {
        int len1=dungeon.size();
        if(len1==0)
            return 1;
        int len2=dungeon[0].size();
        if(len2==0)
            return 1;
        
        vector<int> res(len2,0);//只使用一个数组辅助空间
        for(int i=len1-1;i>=0;i--)
        {
            for(int j=len2-1;j>=0;j--)
            {
                if(i==len1-1&&j==len2-1)//初始化公主房间
                {
                    if(dungeon[i][j]<0)//如果公主房间<0,那想活着必须取绝对值+1
                        res[j]=abs(dungeon[i][j])+1;
                    else
                        res[j]=1;//负责为1即可
                }
                else
                {
                    int temp;//对于边界和中间值,对比的数据是不同的
                    if(i==len1-1)
                        temp=res[j+1];
                    else if(j==len2-1)
                        temp=res[j];
                    else
                        temp=min(res[j],res[j+1]);//如果是中间的值,只需看右或下里面最小值即可
                    
                    if(dungeon[i][j]<0)//如果当前房间掉血,就加上这个绝对值
                        res[j]=temp+abs(dungeon[i][j]);
                    else
                    {
                        if(temp-dungeon[i][j]>0)//如果不掉血且加上这个房间不多于后面需要
                            res[j]=temp-dungeon[i][j];
                        else
                            res[j]=1;//如果加血贼多,后面的房间完全没问题
                    }
                }
                
            }
        }
        
        return res[0];
    }
};

分析:

动态规划不一定等于递归

动态规划还是从后往前思考比较好

原文地址:https://www.cnblogs.com/CJT-blog/p/10843380.html