思路
01背包问题的变式
遍历: i为考虑第 i 个店开不开
遍历: j为只考虑前 j 个店对开第 i 个店的影响
数组dp[ a ]:从前a个店挑选时的最大收益
两种情况:mi 和mj 的距离
1.不大于k:dp[ i ](j)=dp[ i ](j-1)
2.大于k:比较下面两种选更大的(不考虑 j 与 i 之间的店)
(1)不开店 i :dp[ i ](j)不变
(2)开店 i :dp[ i ](j)=dp[ j ]+ p[ i ]
注意:遍历的时候 j 的顺序无所谓,因为每次循环 j 只更新 dp[ i ]一个数据
注意:dp[ i ]的初始值要设为p[ i ]
备注
直接使用滚动数组的时候理解起来比较抽象,先用二位数组理解题意再改写成滚动数组更容易理解
#include <bits/stdc++.h>
using namespace std;
int main()
{
int T,i,j,n,k;
scanf(