題目:
在每年的淘寶“雙十一”時,訪問量都會暴漲,服務器的請求會被流量分配程序按照一定策略,分發給不同的進程去處理。有一類請求,有兩個進程可以接受分發的請求,其中一個進程所在服務器的配置、網絡傳輸性能等都要優於另一個進程。流量分發程序可以知道隊列中每個任務的預計處理時間,每次都會盡可能將隊列中預計處理時間更多的任務分配給性能更優的進程。
假設隊列當前一共有 n 個任務待分配,第 i 個任務的預計處理時間爲 ai(1≤i≤n)。由於服務存在冷啓動問題,越靠後的進程,預計處理時間越短。而隊列中的 最後一個任務 因爲比較特殊,預計處理時間和之前的任務 無關。即前 n−1 個任務的預計處理時間滿足 a1>a2>...>an−1。現在要從中選出一個任務列表,不能有任何兩個任務在原隊列中相鄰。計算選出的任務隊列預計處理時間之和的最大值。
輸入格式
輸入第一行有一個整數 n(1≤n≤104),表示任務總數。
輸入第二行有 n 個整數 ai(0≤ai≤104),表示每個任務的預計處理時間。
輸出格式
輸出一個整數,表示選出的任務的預計處理時間之和的最大值。
樣例輸入1
5 4 3 2 1 5
樣例輸出1
11
樣例輸入2
4 5 3 1 9
樣例輸出2
14
可以用動態規劃,dp[i]=max(dp[i],dp[j]+a[i]),1<=1j<i-1;dp[i]表示原序列前i個最大值;
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
#define maxn 10000+5
int a[maxn],dp[maxn];
int main()
{
int n,ans=0;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf_s("%d", &a[i]);
dp[1] = a[1]; dp[2] = a[2];
ans = max(dp[1], dp[2]);
for (int i = 3; i <= n; i++)
{
for(int j=1;j<i-1;j++)
dp[i] = max(dp[j] + a[i],dp[i]);
ans = max(dp[i], ans);
}
printf("%d", ans);
return 0;
}