每日一题 7月29日Max Power DP

链接:https://ac.nowcoder.com/acm/problem/20663
来源:牛客网

题目描述

小卤蛋刚把dnf的技能点重新洗了一遍,现在他要重新加点,假设他的技能树一共有n层,第i层有n-i+1个
技能,每个技能只能够学习一次。除了第1层的技能可以直接学习外,其他技能学习都要学习前置技能,
即你要学习第i(i>=2)层第j列的技能,那么你要先学习第i-1层的第j列和第j+1列的技能。每个技能学习
后都会获得一定的战力加成。
现在小卤蛋有m个技能点,一个技能点可以学习一个技能,他想知道加完点后他可以获得的最大战力加成为多少。

输入描述:

有多组样例输入,输入到文件结束.
每组样例第一行输入2个整数n(1<=n<=50)和m(1<=m<=1300),对应题目上的含义。
接下来共有n行,第i行有n-i+1个数,代表这个技能学习后获得的战力加成(战力加成<=1000)。

输出描述:

输出最大的战力加成。

输入

4 3
1 4 1 9
2 3 5
6 1
66

输出

15

思路

对于一个技能塔
图片说明
学习红色的技能时,必须把倒三角全部学习完。 表示i-n行的所有行学习了k个技能,并且第i行学习了j个技能的最大战力加成。

#include<bits/stdc++.h>
using namespace std;

int a[55][55], s[55][55], f[55][55][1305];
int main() {

    int n, m;
    while(~scanf("%d%d", &n, &m)) {
        memset(s, 0, sizeof(s));
        for(int i=1; i<=n; i++) {
            for(int j=1; j<=n-i+1; j++) {
                scanf("%d", &a[i][j]);
            }
        }
        for(int j=1; j<=n; j++) {
            for(int i=1; i<=n-j+1; i++) {
                s[j][i]=s[j][i-1]+a[i][j];
            }
        }


        memset(f, 0xc0, sizeof(f));
        int mx=0;
        f[n+1][0][0]=0;
        for(int i=n; i>=1; i--) {
            for(int j=0; j<=n-i+1; j++) {
                for(int k=j; k<=m; k++) {
                    for(int p=max(j-1, 0); p<=n-i; p++) {
                        f[i][j][k]=max(f[i][j][k], f[i+1][p][k-j]+s[i][j]);
                        //cout<<i<<" "<<j<<" "<<k<<" "<<f[i][j][k]<<endl;
                    }
                }
                mx=max(mx, f[i][j][m]);
            }
        }
        printf("%d\n", mx);
    }



    return 0;

}
全部评论

相关推荐

HR_丸山彩同学:你的项目描述里,系统设计讲了很多:MemCube是什么、三级存储架构怎么设计、四种遗忘策略分别是什么。这些面试的时候讲没问题,但简历上不需要这么细。 简历要突出的是影响力,不是实现细节。面试官看简历的时候想知道的是「这个项目有多大价值」,不是「这个项目具体怎么实现的」。实现细节是面试时候聊的 怎么改:技术细节可以精简为一句「采用三级存储架构+四种遗忘策略」,把省出来的篇幅用来写影响力。比如:项目有没有开源?有没有写成技术博客?有没有被别人使用过? 校园经历没有任何信息量,任何人都可以写这句话,写了等于没写。更关键的是,你投的是技术岗,校园活动经历本来就不是加分项。如果非要写,必须写出具体的数字和成果。如果你没有这些数字,那就老老实实删掉 「端到端耗时缩减30-40%」要给出确切数字和绝对值。从1000ms降到600ms是降了40%,从100ms降到60ms也是降了40%,但这两个含义完全不一样。其他也是,涉及到数据,准备好证据,口径统一,面试会问 「熟练」「熟悉」「了解」混在一起用,读起来很乱。而且「了解前端需求」最好改成「具备前后端协作经验」
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务