题目如下
薯队长写了n篇笔记,编号从1~n,每篇笔记都获得了不少点赞数。
薯队长想从中选出一些笔记,作一个精选集合。挑选的时候有两个规则:
1.不能出现连续编号的笔记。
2.总点赞总数最多
如果满足1,2条件有多种方案,挑选笔记总数最少的那种。
题目思路: 动态规划思想。 dp[i]表示前i篇笔记点赞总数最多。cnt[i]表示笔记的笔记总数。
#include<vector>
#include<iostream>
#include<string>
#include<algorithm>
#include<set>
using namespace std;
class Solution {
public:
vector<int> notebook(int n,vector<int> nums)
{
vector<int> res;
if(nums.size()<=0) return res;
vector<int> dp(n);
vector<int> cnt(n);
if(n==1)
{
res.push_back(nums[0]);
res.push_back(1);
return res;
}
if(n==2)
{
res.push_back(max(nums[0],nums[1]));
res.push_back(1);
return res;
}
dp[0]=nums[0];
cnt[0]=1;
dp[1]=nums[1];
cnt[1]=1;
for(int i=2;i<n;i++)
{
if(dp[i-1]>dp[i-2]+nums[i])
{
dp[i]=dp[i-1];
cnt[i]=cnt[i-1];
}
else
{
dp[i]=dp[i-2]+nums[i];
cnt[i]=cnt[i-2]+1;
}
}
int max_dp=dp[0],min_cnt;
for(int i=1;i<n;i++)
{
if(dp[i]>max_dp)
{
max_dp=dp[i];
min_cnt=cnt[i];
}
else if(dp[i]=max_dp && cnt[i]<min_cnt)
{
min_cnt=cnt[i];
}
}
res.push_back(max_dp);
res.push_back(min_cnt);
}
};
int main(){
Solution s;
vector<int> nums;
int n;
std::cin>>n;
int m;
for(int i=0;i<n;i++)
{
cin>>m;
nums.push_back(m);
}
auto a=s.notebook(n,nums);
cout<<a[0]<<' '<<a[1];
return 0;
}