[周賽] FZU 2177

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

6
5 9 8 2 1 6

Sample Output

77

思路:由於每兩個組成一個炸藥才能造成傷害,所以從第二個炸藥開始,在dp數組裏記錄傷害值,之後每增加一個炸藥就從這個炸藥開始向前組合,枚舉組合炸彈所需的數量,並且找到所有組合中傷害最大的情況記錄到當前dp數組中。
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <cmath>
#define INF 0x3f3f3f3f
using namespace std;
int main()
{
    int n,i,j;
    int a[1010];
    int dp[1010];
    while(scanf("%d",&n)!=EOF)
    {
        memset(dp,0,sizeof(dp));
        for(i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        int maxx,minn;
        for(i=1;i<=n;i++)
        {
            maxx=a[i];
            minn=a[i];
            for(j=i-1;j>=1;j--)
            {
                maxx=max(maxx,a[j]);
                minn=min(minn,a[j]);
                if(dp[i]<dp[j-1]+(maxx-minn)*(maxx-minn))
                    dp[i]=dp[j-1]+(maxx-minn)*(maxx-minn);
            }
        }
        printf("%d\n",dp[n]);
    }
    return 0;
}


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