最大子数组和
如果定义dp[i]为0到i内最大子数组和,那求解就很难了
正确答案为以i结尾的最大子数组和,那么状态转移方程就很容易得出:dp[i+1]=max{dp[i]+a[i+1], a[i]}
类似的题还有最长连续递增子数组
最长上升子序列
法一:n*n的动态规划
class Solution {public:int lengthOfLIS(vector<int>& nums) {vector<int> dp;dp.resize(nums.size());dp[0]=1;int res = 1;for(int i=1;i<nums.size();i++) {dp[i] = 1;for(int j=0;j<i;j++) {if(nums[j]<nums[i]) dp[i]=max(dp[i], dp[j]+1);}// cout<<i<<' '<<dp[i]<<endl;res = max(res,dp[i]);}return res;}};
法二:n*logn的贪心
让序列上升地尽可能慢,以输入序列[0,8,4,12,2] 为例:第一步插入 00,d = [0]d=[0]第二步插入 88,d = [0, 8]d=[0,8]第三步插入 44,d = [0, 4]d=[0,4]第四步插入 1212,d = [0, 4, 12]d=[0,4,12]第五步插入 22,d = [0, 2, 12]d=[0,2,12]。
