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];
}
浙公网安备 33010602011771号