zoukankan      html  css  js  c++  java
  • 算法训练 最大的算式

     问题描述
      题目很简单,给出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
     
     
    分析;
    个人出的问题在数值类型上,参加计算的只要有 long long 类型,全部都设置为long long 类型
    动态规划要找到递推关系式,代码很详细,没看懂建议手多敲几次,坚持就是胜利!!!
     1 //最大模式 动态规划 自我实现 
     2 // 2<=N<=15, 0<=K<=N-1
     3 #include<iostream>
     4 using namespace std;
     5 
     6 long long temp;
     7 long long sum[20]={0};
     8 long long dp[20][20]={0};
     9 int main()
    10 {
    11 int n,k;
    12 cin>>n>>k;
    13 for(int i=1;i<=n;i++) {
    14 cin>>temp;
    15 sum[i]=sum[i-1]+temp;
    16 dp[i][0]=sum[i]; 
    17 }
    18 
    19 for(int i=1;i<=n;i++){ //一步一步递进
    20 int right=min(i-1,k);
    21 for(int j=1;j<=right;j++){ //right次递推
    22 //假设的是每一次都是乘以 dp[i-1][j-1]*a[i] 
    23 //为了保证最大 dp[i][j] 比较 dp[x][j-1]*(sum[i]-sum[x]) 1<=x<=i-1 
    24 for(int x=1;x<=i-1;x++) dp[i][j]=max(dp[i][j],dp[x][j-1]*(sum[i]-sum[x]));
    25 } 
    26 }
    27 cout<<dp[n][k];
    28 }
    29 
    30  
    View Code
     
     
     
  • 相关阅读:
    SharePoint 2013 开发——开发并部署Provider-hosted APP
    SharePoint 2013 开发——Provider-hosted APP准备工作
    (转)CString工作原理和常见问题分析
    WinDbg调试 C# dmp
    使用fastcall 代替汇编hook thiscall
    Windows Socket 编程_单个服务器对多个客户端简单通讯
    IOCP模型与网络编
    非阻塞模式(ioctlsocket)
    GDT与LDT
    常见程序入口点(OEP)特征
  • 原文地址:https://www.cnblogs.com/helloworld2019/p/10340680.html
Copyright © 2011-2022 走看看