• 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 许可协议。转载请注明出处!
  • 相关阅读:
    SQLite 的连接串
    输入数组长度大于此表中的列数
    MVC3.0入门学习笔记页面传值ViewData
    MVC3.0入门学习笔记页面传值TempData
    在控制台程序中显示进度
    WCF学习笔记(1) 一个简单的wcf实例
    webBrowser 操作无ID元素
    webBrowser 设置文本框
    cookie总结
    checkbox是否被选择
  • 原文地址:https://www.cnblogs.com/radiumlrb/p/5792082.html
Copyright © 2020-2023  润新知