剑指30:动态规划之最大连续子序列之和

连续子数组的最大和

http://www.nowcoder.com/questionTerminal/459bd355da1549fa8a49e350bf3df484

动态规划解法原理及C++语言实现(附暴力枚举法):

///////////////////////////////////////////////
①动态规划:
首先把问题转换为“截止(包含)当前元素的最大子序列之和”,即拆分为array.size()个子问题;
然后用动态规划求解每个子问题,建立当前问题和前一个问题的关系即可;
首先解决第一个问题:dp[0]=array[0];
当前问题和前一个问题的关系如下:
dp[n-1]>0时:dp[n]=array[i]+dp[n-1];
dp[n-1]<0时:dp[n]=array[i];
最后找出动态规划数组dp中的最大元素即可。
///////////////////////////////////////////////
class Solution {
public://动态规划解法,只遍历一遍数组
    int FindGreatestSumOfSubArray(vector<int> array) {
        int dp[array.size()];//也可以用单独一个数记录
        dp[0] = array[0];
        int max = array[0];
        for(int i = 1;i < array.size();i++){
            int newmax = array[i] + dp[i-1];
            if(newmax > array[i])
                dp[i] = newmax;
            else
                dp[i] = array[i];
            if(dp[i] > max)
                max = dp[i];
        }
        return max;
    }
};
///////////////////////////////////////////////
②暴力枚举+排序
///////////////////////////////////////////////
class Solution {
public://暴力枚举+排序
    int FindGreatestSumOfSubArray(vector<int> array) {
        vector<int> res;
        for(int i = 0;i < array.size();i++){
            int temp = array[i];
            res.push_back(temp);
            for(int j = i+1;j < array.size();j++){
                temp += array[j];
                res.push_back(temp);
            }
        }
        sort(res.begin(),res.end());
        return res[res.size()-1];
    }
};
全部评论

相关推荐

05-13 02:01
已编辑
惠州学院 前端工程师
安静的少年在求佛:建议把公司名字写到标题。以后有人想搜就能直接搜到
点赞 评论 收藏
分享
星辰再现:裁员给校招生腾地方
点赞 评论 收藏
分享
今天投了小鹏,收到了AI面,大概会问哪些啊?
期末一定及格:总共4个部分,心理测评、行测、然后就是问岗位、对岗位的理解、过往遇到了哪些难点怎么解决,很简单,没有什么特别专业的问题,都是一些综合素质相关的
小鹏汽车AI面7人在聊
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务