您的位置:首页 > 其它

淘宝流量分配(动态规划)

2017-10-15 20:02 106 查看
假设队列当前一共有 nn 个任务待分配,第 ii 个任务的预计处理时间为 a_i(1
\leq i \leq n)a​i​​(1≤i≤n)。由于服务存在冷启动问题,越靠后的进程,预计处理时间越短。而队列中的 最后一个任务 因为比较特殊,预计处理时间和之前的任务 无关。即前 n-1n−1 个任务的预计处理时间满足 a_1
> a_2 > ... > a_{n-1}a​1​​>a​2​​>...>a​n−1​​。现在要从中选出一个任务列表,不能有任何两个任务在原队列中相邻。计算选出的任务队列预计处理时间之和的最大值。

输入格式

输入第一行有一个整数 n(1
\leq n \leq 10^{4})n(1≤n≤10​4​​),表示任务总数。

输入第二行有 nn 个整数 a_i(0
\leq a_i \leq 10^{4})a​i​​(0≤a​i​​≤10​4​​),表示每个任务的预计处理时间。

输出格式

输出一个整数,表示选出的任务的预计处理时间之和的最大值。

样例输入1

5
4 3 2 1 5


样例输出1

11


样例输入2

4
5 3 1 9


样例输出2

14


b[i]表示前i个数的无相邻的最大值,对a[i]而言,b[i]中可以包含a[i]也可以不包含。如果b[i]包含a[i]则b[i]一定不包含a[i-1](因为不能相邻),所以b[i]=b[i-2]+a[i].如果b[i]不包含a[i],则b[i]=b[i-1].

          b[0],             i=0;

b[i ]= max(b[0],b[1]),    i=1;

         max(b[i-1],b[i-2]+a[i]) ,  i>=2;

#include<iostream>

using namespace std;

int main()

{

int n; 

cin>>n;

int a
,b
;

for(int i=0;i<n;i++)

cin>>a[i];

b[0]=a[0];

b[1]=max(a[1],a[0]);

int maxtime=0;

for(int i=2;i<n;i++)

{
b[i]=max(b[i-1],b[i-2]+a[i]);//b[i]表示前i项的最大值   

}

cout<<b[n-1]<<endl; 

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: