zoukankan      html  css  js  c++  java
  • TYVJ P1045 &&洛谷 1388 最大的算式 Label: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之间)。

    输出格式

    输出文件仅一行包含一个整数,表示要求的最大的结果
    最后的结果<=maxlongint

    测试样例1

    输入

    5 2 
    1 2 3 4 5

    输出

    120

    备注

    对于30%的数据,N<= 10;
    对于全部的数据,N <= 100。

    代码

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    
    int f[105][105],sum[105][105],N,K,a[105];
    
    int main(){
    //    freopen("01.txt","r",stdin);
        scanf("%d%d",&N,&K);
        for(int i=1;i<=N;i++) scanf("%d",&a[i]);
        
        for(int i=1;i<=N;i++)
            for(int j=i;j<=N;j++)
                sum[i][j]=sum[i][j-1]+a[j];
        
        for(int i=1;i<=N;i++) f[i][0]=sum[1][i];
        
        for(int i=1;i<=K;i++)
            for(int j=i+1;j<=N;j++)
                for(int k=i;k<j;k++)
                    f[j][i]=max(f[j][i],f[k][i-1]*sum[k+1][j]);
    
        printf("%d
    ",f[N][K]);
        return 0;
    }

    跟tyvj 1047基本一样,移步看那个题解吧

    http://www.cnblogs.com/radiumlrb/p/5782800.html

    版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!
  • 相关阅读:
    slice()、substring()、substr()的区别用法
    程序员如何快速上手一个自己不太熟悉的新项目?有什么技巧?
    计算重复字符串长度
    计算机视觉算法研发岗招聘要求
    C++进阶STL-2
    C++进阶STL-1
    拼硬币
    序列找数
    寻找合法字符串
    字符串是否由子串拼接
  • 原文地址:https://www.cnblogs.com/radiumlrb/p/5792082.html
Copyright © 2011-2022 走看看