1.剑指 Offer 42. 连续子数组的最大和
动态规划思考过程:
状态定义:设 dp[i] 为以nums[i] 结尾所能获取的连续数组最大和,nu[i]为包含i的连续数组最大值; 转移方程:那么很好想到dp[i] 应该为 dp[i - 1] 、nu[i]之间的最大值;即有 dp[i] = max( dp[i - 1], nu[i]); 初始状态:dp[0] = nums[i], nu[0] = nums[i]; 返回值:dp[n - 1] 其中n为数组长度
算法过程:
从 i = 1 的位置开始遍历,nu[i]在遍历过程中判断公式如下: nu[i] = nu[i - 1] > 0 ? nu[i] + nums[i] : nums[i];//若前一项的nu[i - 1]小于0,那么nu[i]应当就是他自身,否则,就应该为nu[i - 1] + nums[i]. dp[i]在遍历过程的判断公式如下: dp[i] = dp[i - 1] > nu[i] ? dp[i - 1] : nu[i];
根据上述思想,可以得到如下代码:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if(nums.size() == 0)
return NULL;
if(nums.size() == 1)
return nums[0];
int ans = nums[0], nui = nums[0];
for(int i = 1; i < nums.size(); i++){
nui = nui > 0 ? nui + nums[i] : nums[i];
ans = ans > nui ? ans : nui;
}
return ans;
}
};
2.剑指 Offer 47. 礼物的最大价值
动态规划思考过程:
状态定义:dp[i][j]为 到坐标(i, j)所能得到的最大价值 转移方程: 第0行节点只能是上一个节点右移到达 第0列节点只能是上一个节点下移到达 当节点为非0行非0列的节点时,经过上方节点和左方节点之间的较大值到达 初始状态:dp[0][0] = gird[0][0]; 返回值:grid[n - 1][m - 1] 其中n为行长,m为列高
根据上述思想,可以得到如下代码:
class Solution {
public:
int maxValue(vector<vector<int>>& grid) {
//i表示行号,j表示列号
for(int i = 0; i < grid.size(); i++){
for(int j = 0; j < grid[0].size(); j++){
if(i == 0 && j == 0)
continue;
if(i == 0){
grid[i][j] += grid[i][j - 1];
continue;
}
if(j == 0){
grid[i][j] += grid[i - 1][j];
continue;
}
grid[i][j] += (grid[i - 1][j] > grid[i][j - 1] ? grid[i - 1][j] : grid[i][j - 1]);
}
}
return grid[grid.size() - 1][grid[0].size() - 1];
}
};