一維消消樂(DP)


 

一維消消樂是一款非常簡單的游戲。有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 }

 

 

 

 

 

-


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM