zoukankan      html  css  js  c++  java
  • 蓝桥杯 最大的算式 dp

    问题描述
      题目很简单,给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量大。因为乘号和加号一共就是N-1个了,所以恰好每两个相邻数字之间都有一个符号。例如:
      N=5,K=2,5个数字分别为1、2、3、4、5,可以加成:
      1*2*(3+4+5)=24
      1*(2+3)*(4+5)=45
      (1*2+3)*(4+5)=45
      ……
    输入格式
      输入文件共有二行,第一行为两个有空格隔开的整数,表示N和K,其中(2<=N<=15, 0<=K<=N-1)。第二行为 N个用空格隔开的数字(每个数字在0到9之间)。
    输出格式
      输出文件仅一行包含一个整数,表示要求的最大的结果
    样例输入
    5 2
    1 2 3 4 5
    样例输出
    120
    样例说明
      (1+2+3)*4*5=120
    参考于https://www.cnblogs.com/cao-lei/p/6690827.html和https://blog.csdn.net/Tesla_meng/article/details/88614520
    因为不能改变数字的相对位置,所以只考虑乘号在哪里,不考虑括号。
    利用前缀和思想,用sum[i]保留前i个数的和便于快速求出a[p]+a[p+1]+...+a[i]的值(见下图),用dp[i][j]保留前i个数中含有j个乘号的最大的结果。那么我们最终要求的是dp[n][k]。显然,dp[i][0]=sum[i],因为没有一个乘号,全为加号,所以就相当于求前n项和。
    记a[1]=1,a[2]=2,...,a[5]=5
    dp[2][1] = dp[1][0] * a[2]。注释:两个数一个乘号,即为1*2
    dp[3][1] = max(dp[2][0]a[3], dp[1][0](a[2]+a[3]))。注释:三个数一个乘号,即为(1+2)*3和1*(2+3)中的最大值
    dp[4][1] = max(dp[3][0]a[4], dp[2][0](a[3]+a[4]), dp[1][0](a[2]+a[3]+a[4]))。注释:四个数一个乘号,即为(1+2+3)*4和(1+2)*(3+4)和1*(2+3+4)中的最大值
    所以,我们得到dp[i][j] = max(dp[i][j], dp[p-1][j-1](sum[i]-sum[p-1])) (p表示插入的乘号的位置,2<=p<=i)
    sum[i]-sum[p-1]为前缀和算法
    注意数据范围,最大的结果是15个9相乘,9^15超过了int范围,开long long。
     1 #include <bits/stdc++.h> 
     2 using namespace std;
     3 long long dp[20][20];
     4 long long sum[20];
     5 int main() {
     6     int n, k;
     7     cin >> n >> k;
     8     for(int i = 1; i <= n; i++) {
     9         int t;
    10         cin >> t;
    11         sum[i] = sum[i - 1] + t;
    12         dp[i][0] = sum[i]; 
    13     }
    14     for(int i = 2; i <= n; i++) { //数字个数逐渐增加 
    15         for(int j = 1; j <= i - 1 && j <= k; j++) { //乘号个数逐渐增加 
    16             for(int p = 2; p <= i; p++)    { //乘号的位置逐渐往后移  
    17                 dp[i][j] = max(dp[i][j], dp[p - 1][j - 1] * (sum[i] - sum[p - 1]));
    18             }
    19         }
    20     }
    21     cout << dp[n][k] << endl;
    22     return 0;
    23  } 

     

  • 相关阅读:
    vue中的 computed 和 watch 的区别
    mysql8.0 初始化数据库及表名大小写问题
    sql server alwayson 调整数据文件路径
    zabbix 自定义监控 SQL Server
    mysql 创建用户及授权
    mysql 设置从库只读模式
    mysql8.0 主从复制安装及配置
    centos8.0安装mysql8.0
    centos8替换阿里数据源
    npm publish 报错 【you or one of your dependencies are requesting a package version that is forbidden by your security policy】
  • 原文地址:https://www.cnblogs.com/fx1998/p/12597855.html
Copyright © 2011-2022 走看看