小烈一下碰碰車就被樂滿地的工做人員抓住了。做爲擾亂秩序的懲罰,小烈必須去樂滿地裏的「灕江村」飯店端盤子。c++
服務員的工做很繁忙。他們要上菜,同時要使顧客們儘可能高興。一位服務生爲n個顧客上菜。這n個顧客坐成一排,小烈從一端的廚房中端出n盤菜(不要問我爲何小烈能一會兒端住2500 盤菜,他就是能)爲n個顧客各上一道相同的菜。算法
顯然,小烈須要走一個來回,如圖:spa
原本,小烈能夠按1,2,3,...n的順序一次給每一個顧客上菜,可是,聰明的小烈經過觀察發現,每一個顧客都有一個開心值 H,離廚房最近的爲H1 ,而後依次爲\(H_2\),\(H_3\)...\(H_n\) 。若小烈給第j位顧客上菜前剛剛爲第i位顧客上菜,則第j位就會高興,產生高興指數\(W_j =H_i*H_j\)。這樣,若是小烈按必定的方式調整上菜順序,能夠獲得更高的高興指數。如今小烈想知道用某一方法可達到的n位顧客高興指數之和的最大值S。由於顧客越高興,給小烈的小費越多。第一位上菜的顧客不產生高興值。code
第一行一個整數n,顧客的數目。
第二行n個數,第i個數表示第i位顧客的開心值。各個數字用空格隔開。blog
一個數s,爲高興指數的最大值。it
3 7 1 9
72
f[i+1][j] = max(f[i][j],f[i+1][j] + a[i+1]*a[i])//由i位置轉移過來 f[i][i+1] = max(f[i][i+1],f[i][j] + a[i+1]*a[j])//由j位置轉移過來
f[i+1][j] = max(f[i][j],f[i+1][j] + a[i+1]*a[i]) f[i+1][i] = max(f[i][i+1],f[i][j] + a[i+1]*a[j])
#include<bits/stdc++.h> using namespace std; const int maxn = 2500+10; int a[maxn],f[maxn][maxn]; int main(){ int n,ans = 0; scanf("%d",&n); for(int i = 1;i <= n;++i)scanf("%d",&a[i]); for(int i = 1;i <= n;++i) for(int j = 0;j < i;++j){ f[i+1][j] = max(f[i][j] + a[i+1]*a[i],f[i+1][j]); f[i+1][i] = max(f[i][j] + a[i+1]*a[j],f[i+1][i]); } for(int i = 0;i < n;++i)ans = max(ans,f[n][i] + a[n]*a[i]); printf("%d",ans); return 0; }