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]; } };
分析:
动态规划不一定等于递归
动态规划还是从后往前思考比较好