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

-

原文地址:https://www.cnblogs.com/jiamian/p/12199456.html

时间: 2024-08-02 08:34:48

一维消消乐(DP)的相关文章

(状压dp)2017 计蒜之道 复赛 F. 腾讯消消乐

腾讯推出了一款益智类游戏--消消乐.游戏一开始,给定一个长度为 nn 的序列,其中第 ii 个数为 A_iA?i??. 游戏的目标是把这些数全都删去,每次删除的操作为:选取一段连续的区间,不妨记为 [L,R][L,R],如果这一段区间内所有数的最大公约数 \geq k≥k(kk 值在游戏的一开始会给定),那么这一段区间就能被直接删去. 注意:一次删除以后,剩下的数会合并成为一个连续区间. 定义 f(i)f(i) 为进行 ii 次操作将整个序列删完的方案数. 你需要实现一个程序,计算 \sum_{

计蒜客 腾讯消消乐

题意 腾讯推出了一款益智类游戏――消消乐.游戏一开始,给定一个长度为n的序列,其中第i个数为A[i], 游戏的目标是把这些数全都删去,每次删除的操作为:选取一段连续的区间,不妨记为[L,R], 如果这一段区间内所有数的最大公约数 >= k(k的值在游戏的一开始会给定),那么这一段区间就能被直接删去. 注意:一次删除以后,剩下的数会合并成为一个连续区间. 定义f(i)为进行i次操作将整个序列删完的方案数. 你需要实现一个程序,计算  数据 1 <= n <= 18, 1 <= A[i

开心消消乐 - 基于R

1 #let's begin, generate a sample with 5 kinds of animals 2 begin=sample(1:5,100,replace = TRUE) 3 4 #generate n random numbers come from 5 categories 5 r=function(n){ 6 r=sample(1:5,n,replace = TRUE) 7 } 8 9 #define play styles 10 play.row=function(

消消乐

问题需求讲解 其实第一次写简单的消消乐的代码,是在N多年前入职后的一次新员工的编码比赛上,因为当时允许C++,让我不得不重新翻了几遍丢到角落好多年的<谭浩强C++>.消消乐的需求非常直观明了,每个消消乐的游戏规则或许都有差异,但是不变的是,都是对相同类型的栅格先进行聚合,再判定是否需要进行消除.假设有如下9宫格: 那么首先就需要找出红线区域内的聚合区域.因为我们专题是染色算法,所以重点讲解如何通过染色算法求得聚合区域. 问题简述为:在nxm的图内,求所有同类型的栅格的聚合区域. 输入:int[

消消乐、candy crush类三消游戏程序逻辑分析

最近在开发一款类似消消乐的三消游戏,在碰到实现斜方向下落的时候卡住了很长时间.好几天没有思路,原本的思路是一次性预判多个宝石的一连串运动路径,运用缓动运动队列来实现宝石运动路径,例如 下落->滑落->下落.用这种方式虽然会提高性能,但发现总是无法预判所有宝石运动路径,可能性太多了,比如某一个宝石的下落原本只会朝下,但加入了斜下落后会有三种可能,左下,下,右下,20个宝石的下落就会有3的20次方种可能,其产生的可能性会呈指数级别增加,是不可能预测的,也就是用动画队列来实现完全不可能.于是放弃这种

UVa 10828 Back to Kernighan-Ritchie 高斯消元+概率DP

题目来源:UVa 10828 Back to Kernighan-Ritchie 题意:从1开始 每次等概率从一个点到和他相邻的点 有向 走到不能走停止 求停止时每个点的期望 思路:写出方程消元 方程有唯一解 多解 无解的情况 有环 一直再环里无法停止算无穷大 从1不能到的点期望为0 #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <

开心消消乐分析

在像Flappy bird这种操作简单的一波游戏来袭之后,虽然这种类型的游戏会流传的很快,但是也会消落的很快,对于爱玩游戏的人来说,很快就会发现这种游戏的无力感,没有什么乐趣,只是为了跟别人一起争个名次.这种类型的游戏,只是带给了人们新鲜感,一旦这种游戏泛滥了,如果没有什么新的创意,人们就开始疲乏了.也会感觉到这种游戏的枯燥无聊. 开心消消乐的出现,带给我新的感受. 1.界面很漂亮,没有了那种极简风格. 2.利用了QQ的关系,加入社交元素,向好友求助等功能使人们把自己的好友拉进来一起玩. 3.游

hdu4870 Rating (高斯消元或者dp)

Rating Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 213 Accepted Submission(s): 126 Special Judge Problem Description A little girl loves programming competition very much. Recently, she has f

Unity3D_(游戏)开心消消乐

大三狗开学,预计9月17日前完成~ 开心消消乐01 通过Gizmos影藏Scene场景中小摄像机 (点击摄像机进行关闭) 新建一个GameObject->New Sprite,甜甜圈拖动上Sprite上,将游戏分层开发(分为渲染层和模型层) 当不知道甜甜圈尺寸时,可以新建一个3D Object->Cube,Cube默认长宽比例为1m 将甜甜圈长宽缩放比例0.45 将甜甜圈做成预设体 原文地址:https://www.cnblogs.com/1138720556Gary/p/9568817.ht