最大子数组和
如果定义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]。