題目描述
有N個不同的正整數數x1, x2, ... xN 排成一排,我們可以從左邊或右邊去掉連續的i(1≤i≤n)個數(只能從兩邊刪除數),剩下N-i個數,再把剩下的數按以上操作處理,直到所有的數都被刪除爲止。
每次操作都有一個操作價值,比如現在要刪除從i位置到k位置上的所有的數。操作價值爲|xi – xk|*(k-i+1),如果只去掉一個數,操作價值爲這個數的值。 問如何操作可以得到最大值,求操作的最大價值。
輸入格式
第一行爲一個正整數N;
第二行有N個用空格隔開的N個不同的正整數。
輸出格式
一行,包含一個正整數,爲操作的最大值
輸入輸出樣例
輸入 #1複製
6 54 29 196 21 133 118
輸出 #1複製
768
說明/提示
【樣例說明】
說明,經過3 次操作可以得到最大值,第一次去掉前面3個數54、29、196,操作價值爲426。第二次操作是在剩下的三個數(21 133 118)中去掉最後一個數118,操作價值爲118。第三次操作去掉剩下的2個數21和133 ,操作價值爲224。操作總價值爲426+118+224=768。
【數據規模】
3≤N≤100,N個操作數爲1..1000 之間的整數。
——題目來源:洛谷
解題代碼如下
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
int n;
cin>>n;
int a[n];
for(int i = 0; i < n; i++)
{
cin>>a[i];
}
int dp[n]; //dp數組記錄:當從左往右刪的時候,去掉前面n個數(用下標表示)時的最大價值
dp[0] = a[0];
for(int i = 1; i < n; i++)
{
for(int j = 0; j < i; j++)
{
if (j == 0) {
dp[i] = max(dp[i-1] + a[i], abs(a[i] - a[j]) * (i - j + 1));
} else {
dp[i] = max(dp[i], abs(a[i] - a[j]) * (i - j + 1) + dp[j-1]);
}
}
}
cout<<dp[n-1];
return 0;
}
結果