每日一练----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
看了解题思路后发现是一道经典的动态规划类题目,解决动态规划类题目应注意好以下几点:
- dp数组中dp[i]的含义。
- 递推公式。
- 状态转移方程。
- 遍历顺序。
- 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总结的主要内容,如果未能解决你的问题,请参考以下文章