牛牛在牛市的旅游纪念商店里面挑花了眼,于是简单粗暴的牛牛决定——买最受欢迎的就好了。
但是牛牛的背包有限,他只能在商店的n个物品里面带m个回去,不然就装不下了。
并且牛牛希望买到的纪念品不要太相似,所以导购小姐姐帮助牛牛把纪念品全部排成了一行,牛牛只需要让选出来要买的m个物品中任意两个的位置差都大于等于k就行了。
现在告诉你这n个物品排成一行之后的受欢迎程度(可能是负数),求牛牛带回去的m个物品的最大欢迎度之和。
第一行三个数n,m,k
接下来一行,有n个整数,是n个物品按顺序的受欢迎程度。
输出一个数为题目所求的最大和
复制
4 2 2
2 4 -6 1
复制
5
n≤10000,m≤100,m≤n,答案保证在int范围内,保证按照题目要求一定能取到m个物品
1
#include
using namespace std;
#define int long long
#define endl '\n'
#define YES cout<<"YES"< PII;
const ll mod=1e9+7;
const int INF=0x3f3f3f3f;
const int N = 1e4+10;
int a[N];
int dp[10010][110];
#define ios ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
void solve()
{int n,m,k;cin>>n>>m>>k;for(int i=1;i<=n;i++){cin>>a[i];}memset(dp,-0x3f,sizeof dp);dp[0][0]=0;for(int i=1;i<=n;i++){dp[i][0]=0;for(int j=1;j<=m;j++){dp[i][j]=max(dp[max(0LL,i-k)][j-1]+a[i],dp[i-1][j]);}}cout< 给我了一点灵感,dp[i][j]=max(dp[max(0LL,i-k)][j-1]+a[i],dp[i-1][j]);他这个有状态继承,也就是说第i,j可能和第i-1,j的值是相等的所以我们不用考虑转移状态呢一个范围
我们可以从具体的状态转移过来不太好想其实就是背包问题的变形同样也是对一个位置进行了两个选择,也就是选择或者不选择
而对于可能满足的位置我们进行了状态转移所以只要维护好最前面的就ok
具体见代码把
代码更清晰
上一篇:5月28日人工智能ETF科创(588760)份额减少1800.00万份,最新份额26.69亿份,最新规模14.22亿元
下一篇:5月28日科创板人工智能ETF(588930)份额减少600.00万份,最新份额7.31亿份,最新规模8.13亿元