zoukankan      html  css  js  c++  java
  • 一维消消乐(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
    ",max(dp[n][0],dp[n][1]));
    37     return 0;
    38 }

    -

  • 相关阅读:
    SpringApplication类-1
    post与head注入
    sql_post注入
    渗透测试点线面合集
    渗透入侵溯源
    VMware 安装Tools 失败的问题:VGAuthService 启动失败
    Weblogic wls-wsat XMLDecoder 反序列化漏洞复现(CVE-2017-10271)
    web常见的中间件漏洞及复现
    XX点评H5字体映射
    python控制阿里云服务器开机,关机,重启
  • 原文地址:https://www.cnblogs.com/jiamian/p/12199456.html
Copyright © 2011-2022 走看看