一维消消乐是一款非常简单的游戏。有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 }
-
来源:https://www.cnblogs.com/jiamian/p/12199456.html