n个物品中取出m个物品,任意两个物品之间的最小间隔为k,求最大的价值。

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

  • 题意:从n个物品中取出m个物品,每个物品有独特的价值(可能为负数),任意两个物品之间的最小间隔为k,求最大的价值。
  • 分析
  • 易得每个物品有取与不取两个状态,dp[i][j]表示前i个物品中取出j个物品,第i个物品必取的最大美好值.
  • 不取:dp[i][j] = dp[i-1][j]
  • 取:dp[i][j] = dp[i-k][j-1] + arr[i]
  • 转移方程:dp[i][j] = max(dp[i-1][j],dp[i-k][j-1] + arr[i])
  • 初始化
    当i<=k时,i-k越界了,上述方程不成立,易得前k个物品只能取一个物品,即得转移方程:
    dp[i][1] = max(dp[i-1][1],arr[i])
点击查看代码
#include<bits/stdc++.h>
using namespace std;
long long dp[10010][150];
long long arr[100010];
int main(){
    int n,m,k;
    cin>>n>>m>>k;
    for(int i = 1;i<=n;i++){
         cin>>arr[i];
    }
    memset(dp,-0x3f3f3f3f,sizeof(dp));
    for(int i = 1;i<=n;i++){
            dp[i][1] = max(dp[i-1][1],arr[i]);
    }
    for(int i = k+1;i<=n;i++){
        for(int j = 2;j<=m;j++){
                dp[i][j] = max(dp[i-1][j],dp[i-k][j-1] + arr[i]);
        }
    }
    cout<<dp[n][m];
}
posted @ 2022-10-07 17:15  重生之我是菜鸟  阅读(36)  评论(0)    收藏  举报