链接:https://www.nowcoder.com/questionTerminal/2c4795605d53423fa9e68aa4c1c6ffb3?answerType=1&f=discussion
来源:牛客网

每个人的职业生涯状态有起有落,程序员也如此。

我们对程序员的状态做一个简化,单纯用缺陷密度来衡量一个程序员一天的状态。如果这一天的缺陷密度比平均值高,则认为他这一天的状态差,高出越多,认为状态越差。比平均值低,则认为状态好,低得越多,认为状态越好。人的状态是可以叠加的,如果两个连续时间段的缺陷密度加起来低于平均值,则认为这两个时间段合起来状态是好的。

给定一个程序员很长一段时间中各个时间片段的缺陷密度(V)与平均值(A)的差值(D=V-A),求出该程序员的黄金时间段的缺陷密度差值D的累加和。
缺陷密度差值D如果为正数,表明缺陷密度高于平均值,如果为负数,表明缺陷密度低于平均值。
所谓黄金时间段,指一个连续时间段,这段时间的缺陷密度与平均值的差值D累加起来,在各种划分方法中,是最小的,也即状态是最好的。

这道题本质上是求最长子数组a的和最小;
方法一:动态规划

  1. 确定状态:f(i)为前i个元素中,最小的和
  2. 状态转移:f(i)=min{f(i-1)+a[i],a[i]}
  3. 确定初始条件:f(0)=a[0]
  4. 确定边界:i<T;(i从0开始)

附代码
#include <iostream>
using namespace std;
int main(){
int T=0;
int result=2^30-1;//取一个较大的值,
int data, pre;//pre就是f(i)
cin>>T;
//判断两种特殊情况
if(T<=0){
cout<<0;
return 0;
}
//初始化f[0]=a[0];
cin>>pre;
if(T==1){
cout<<pre;
return 0;
}
for(int i=1;i<T;i++){
cin>>data;
//f(i)=min{f(i-1)+a[i],a[i]}
//其最小值就是答案
pre=(pre+data)<data?(pre+data):data;//更新状态
result = pre<result?pre:result;//保留最小值
}
cout<<result;
return 0;
}</iostream>