一维消消乐(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 }

 

 

 

 

 

-

posted @ 2020-01-16 13:15  jiamian22  阅读(952)  评论(0编辑  收藏  举报