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