FZU2177

B - Calculus Midterm
Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

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                                            
題解,我之前一直沒有思路,後來看了別人才明白,反思後覺得以後自己也要想想這種方法
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
int a[1100];
int dp[1100];
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int i;
        for(i=0;i<1100;i++)
            dp[i]=0;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        a[0]=a[1];
        for(i=1;i<=n;i++)
        {
            int j;
            for(j=i-1;j>=0;j--)
            {
                int w=(a[i]-a[j+1])*(a[i]-a[j+1]);
                if(dp[i]<=dp[j]+w)
                {
                    dp[i]=dp[j]+w;
                }
            }
        }
        printf("%d\n",dp[n]);
    }
}


發佈了84 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章