题解 | #牛牛的旅游纪念品#

牛牛的旅游纪念品

https://ac.nowcoder.com/acm/problem/207751

牛牛的旅游纪念品 (nowcoder.com)

问题描述:一行有n个物品,要选m个,同时两个选的物品之间的间隔要大于等于k。求选m个的最大价值。

思路:线性dp。状态表示为:在第j个选了i个的最大价值。

转移方程:

状态表示:F(i,j)表示在选了第j个物品后选了i个物品的最大价值。

如果i = 1,对于位置j来说有两个状态,要么选j的物品,要么不选就是前面的最大的物品。如果i > 1 && j > k,对于j也有两个状态,要么选,要么不选,跟i = 1的方式类似。

i = 1i != 1的处理是类似的,但是由于边界的存在,让i = 1的处理变得特殊了。(

边界:

目标:

代码:

const int N = 1e4 + 21;
int f[121][N];
int a[N];
void solve() {
    int n,m,k; cin>>n>>m>>k;
    // 边界处理
    memset(f, -0x3f, sizeof(f));
    rep(i,1,n) {
        cin>>a[i];
    }
    rep(i,1,m) {
        rep(j,1,n) {
            // 如果i = 1,选了一个,要么是前面的,要么是当前位置物品
            if(i == 1) f[i][j] = max(f[i][j-1], a[j]);
            // 如果 j > k,要么不选 - f[i][j-1],要么选 - f[i-1][j-k] + a[j]
            else if(j > k) f[i][j] = max(f[i][j-1], f[i-1][j-k] + a[j]);
        }
    }
    // 目标
    cout<<f[m][n];
}
全部评论

相关推荐

程序员花海:实习太简单了 学历可以的 实习描述应该是先介绍业务 再介绍技术 技术咋推动业务的 做到了啥收益 有没有做实验 实验组和对照组有什么不同 你最后学到了什么 有没有参与处理过线上问题 有没有参与过公司的code review 有没有参与过技术分享 这些都是可以在实习描述中写的 并且实习和项目不一样不会撞车 应该放在最前面 放在教育背景下面 另外项目有点烂大街 可以看下我主页的简历优化案例
点赞 评论 收藏
分享
双尔:你就写拥有ai开发经历,熟练运用提示词,优化ai,提高ai回答质量
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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