I - 麼

Description

Ytaaa作爲一名特工執行了無數困難的任務,這一次ytaaa收到命令,需要炸燬敵人的一個工廠,爲此ytaaa需要製造一批炸彈以供使用。 Ytaaa使用的這種新型炸彈由若干個炸藥組成,每個炸藥都有它的威力值,而炸彈的威力值爲組成這個炸彈的所有炸藥的最大威力差的平方,即(max-min)^2,假設一個炸彈有5個炸藥組成,威力分別爲5 9 8 2 1,那麼它的威力爲(9-1)^2=64。現在在炸彈的製造流水線上已經有一行n個炸藥,由於時間緊迫,ytaaa並沒有時間改變它們的順序,只能確定他們的分組。作爲ytaaa的首席顧問,請你幫助ytaaa確定炸藥的分組,使製造出的炸彈擁有最大的威力和。

Input

輸入由多組數據組成。第一行爲一個正整數n(n<=1000),第二行爲n個數,第i個數a[i]爲第i個炸藥的威力值(0<=a[i]<=1000)。

Output

對於給定的輸入,輸出一行一個數,爲所有炸彈的最大威力和。

Sample Input

65 9 8 2 1 6

Sample Output

77
定義狀態:dp[i]表示前i個炸藥能組成的最大威力和。狀態轉移方程:dp[i]=max(dp[i],dp[j-1]+(a[i]-a[j])^2)

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=1100;
int dp[maxn];
int a[maxn];
int main(){

    int n;
    while(scanf("%d",&n)!=EOF){

        for(int i=1;i<=n;i++){

            scanf("%d",&a[i]);
        }
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++){

            for(int j=i;j>=1;j--){

                dp[i]=max(dp[i],dp[j-1]+(a[i]-a[j])*(a[i]-a[j]));
            }
        }
        printf("%d\n",dp[n]);

    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章