zoukankan      html  css  js  c++  java
  • 【u227】BOOK

    Time Limit: 1 second
    Memory Limit: 128 MB

    【问题描述】

    陈老师喜欢网购书籍,经常一次购它个百八十本,然后拿来倒卖,牟取暴利。前些天,高一的新同学来了,他便像往常一样,兜售他的书,经过一番口舌,同学们决定买他的书,但是CS桌上的书有三堆,每一堆都有厚厚的一叠,他要想个办法用最轻松的方式把书拿下来给同学们.但是你想逗一下CS,于是,请你设计一个最累的方式给他.
    若告诉你这三堆分别有i,j,k本书,以及每堆从下到上书的重量.每次取书只能从任意一堆的最上面取,那么请你帮助他设计一个方案,让他花最大的力气取下所有书(CS别打我).
    显然,每次取书,陈老师的体力消耗都会加大,这里用体力系数代表,取下第一本书时,体力系数为1,第二本时为2,依次类推,而每次体力消耗值则为体力系数和书的重量之积。
    举个例子:
    三堆书及重量如下
    不用证明,最累的取书方式为: 右左左中, 即: 3*1+9*2+2*3+10*4=3+18+6+40=67

    【输入文件】(book.in)
    输入文件的第一行为3个数,分别为三堆数量I,j,k
    第二行至第四行分别为每堆由下至上的书本重量
    【输出文件】(book.out)
    输出最累方式的体力消耗总值即可
    【输入样例】
    3 2 4
    2 3 2
    1 5
    9 8 7 4
    【输出样例】
    257
    【注释】:
    输入数据为每堆由下至上的书本重量!
    【数据规模】
    对于40%的数据有:0<=i<10 0<=j<10 0<=k<10
    对于100%的数据有:0<=i<100 0<=j<100 0<=k<100
    最后输出的体力消耗总值在longint范围内

    【题目链接】:http://noi.qz5z.com/viewtask.asp?id=u227

    【题解】

    /*
        设f[x1][x2][x3]表示第一堆取了x1本,第二堆取了x2本,第3堆取了x3本的最大花费;
        t = x1+x2+x3;
        f[x1][x2][x3] = max(f[x1-1][x2][x3]+a[1][x1]*t,
                               f[i-1][x1][x2-1][x3]+a[2][x2]*t
                               ,f[i-1][x1][x2][x3-1]+a[3][x3]*t);                         
       时间复杂度O(N^2);                           
    */


    【完整代码】

    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define LL long long
    #define rep1(i,a,b) for (int i = a;i <= b;i++)
    #define rep2(i,a,b) for (int i = a;i >= b;i--)
    #define mp make_pair
    #define pb push_back
    #define fi first
    #define se second
    #define rei(x) scanf("%d",&x)
    #define rel(x) scanf("%I64d",&x)
    
    typedef pair<int,int> pii;
    typedef pair<LL,LL> pll;
    
    const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
    const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
    const double pi = acos(-1.0);
    const int MAXN = 110;
    
    int f[MAXN][MAXN][MAXN],a[4][MAXN];
    int n1,n2,n3;
    
    int main()
    {
        //freopen("F:\rush.txt","r",stdin);
        rei(n1);rei(n2);rei(n3);
        rep2(i,n1,1)
            rei(a[1][i]);
        rep2(i,n2,1)
            rei(a[2][i]);
        rep2(i,n3,1)
            rei(a[3][i]);
        rep1(x1,0,n1)
            rep1(x2,0,n2)
                rep1(x3,0,n3)
                    {
                        int i = x1+x2+x3;
                        if (x1>=1)
                            f[x1][x2][x3] = max(f[x1][x2][x3],f[x1-1][x2][x3]+a[1][x1]*i);
                        if (x2>=1)
                            f[x1][x2][x3] = max(f[x1][x2][x3],f[x1][x2-1][x3]+a[2][x2]*i);
                        if (x3>=1)
                            f[x1][x2][x3] = max(f[x1][x2][x3],f[x1][x2][x3-1]+a[3][x3]*i);
                    }
        printf("%d
    ",f[n1][n2][n3]);
        return 0;
    }
    
  • 相关阅读:
    @RequestParam方式传入list
    编写优美代码的七条规范(Python版)
    汇编程序设计入门
    CSP-S2020解题报告(待完成!)
    [USACO18JAN]MooTube
    DP优化
    AFO记
    考前总结
    清北学堂周末刷题班第五场
    清北学堂考前综合刷题班第四场
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626654.html
Copyright © 2011-2022 走看看