每日一练----1.21 oj总结

Posted 赏一杯茶:

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一练----1.21 oj总结相关的知识,希望对你有一定的参考价值。

初识动态规划

  • 题目:一个数组有 N 个元素,求连续子数组的最大和。 例如:[-1,2,1],和最大的连续子数组为[2,1],其和为 3

输入描述:
输入为两行。 第一行一个整数n(1 <= n <= 100000),表示一共有n个元素 第二行为n个数,即每个元素,每个整数都在32位int范围内。以空格分隔。
输出描述:.
所有连续子数组中和最大的值

输入:
3
1 2 1 
输出:
3

看了解题思路后发现是一道经典的动态规划类题目,解决动态规划类题目应注意好以下几点:

  1. dp数组中dp[i]的含义。
  2. 递推公式。
  3. 状态转移方程。
  4. 遍历顺序。
  5. dp数组的初始化。

定义dp数组,初始化数组中的每个值为最小值,dp[i]代表输入数组v的前i项和

    vector<int> dp(n,-1e5);

状态转移为dp[i]与v[i]的关系

    dp[i] = dp[i-1] + v[i] > v[i] ? dp[i-1] + v[i]:v[i];

全部代码如下:

#include <iostream>
#include <vector>
using namespace std;
int main()
    int n;
    cin>>n;
    vector<int> v(n,0);
    for(int i = 0;i<n;++i)
        cin>>v[i];
    
    //定义dp数组,dp数组初始化,循环条件,迭代条件
    vector<int> dp(n,-1e5);
    dp[0] = v[0];
    int _max = v[0];
    for(int i = 1;i<n;++i)
        dp[i] = dp[i-1] + v[i] > v[i] ? dp[i-1] + v[i]:v[i];
        _max = dp[i] > _max?dp[i]:_max;
    
    printf("%d\\n",_max);
    return 0;

以上是关于每日一练----1.21 oj总结的主要内容,如果未能解决你的问题,请参考以下文章

每日一练----1.21 oj总结

每日一练----1.18 oj总结

每日一练----1.18 oj总结

每日一练----1.22 oj总结

每日一练----1.22 oj总结

每日一练----1.22 oj总结