一維消消樂是一款非常簡單的游戲。有n顆珠子排成一排,每一顆珠子有一個價值w(可能是負數)。
游戲是這樣,你可以選擇如若干對相鄰的珠子,讓他們同時消去。每一對珠子的消失,都會使得總分數加上兩顆珠子相乘的分數。
注意,每個珠子只能消一次,並且珠子消去以后,還會占位。
輸入格式
輸入第一行一個整數n(1≤n≤10000)。
接下來一行輸入n個整數wi(-1000≤wi≤1000)。
輸出格式
輸出最大的分數。
樣例輸入
8 -9 -5 -4 -2 4 -5 -4 2
樣例輸出
73
用dp[i][0]表示前i數,第i個數沒有和前面的數組合的最大值。
用dp[i][1]表示前i個數,第i個數已經和前面的數組合的最大值。
那么
dp[i][0]=max(dp[i-1][0],dp[i-1][1])
dp[i][1]=dp[i-1][0]+w[i-1]*w[i]
1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <string> 5 #include <math.h> 6 #include <algorithm> 7 #include <vector> 8 #include <stack> 9 #include <queue> 10 #include <set> 11 #include <map> 12 #include <sstream> 13 const int INF=0x3f3f3f3f; 14 typedef long long LL; 15 const int mod=1e9+7; 16 const double PI = acos(-1); 17 const double eps =1e-8; 18 #define Bug cout<<"---------------------"<<endl 19 const int maxn=1e5+10; 20 using namespace std; 21 22 int a[10010]; 23 int dp[10010][2];//0表示沒有和前面的組合,1代表和前面的組合 24 25 int main() 26 { 27 int n; 28 scanf("%d",&n); 29 for(int i=1;i<=n;i++) 30 scanf("%d",&a[i]); 31 for(int i=2;i<=n;i++) 32 { 33 dp[i][0]=max(dp[i-1][0],dp[i-1][1]); 34 dp[i][1]=dp[i-1][0]+a[i-1]*a[i]; 35 } 36 printf("%d\n",max(dp[n][0],dp[n][1])); 37 return 0; 38 }
-
