先做简单的数据处理,合并相同的数字,然后可以当成偷盗问题
#include <iostream>
#include <vector>
using namespace std;
int main() {
//ai<10^4
int n,t,i;
cin>>n;
vector<int> items;
while(n-- && cin>>t){
if(t+1>items.size())items.resize(t+1,0);
items[t]+=t;
}
vector<int> dp(items.size(),0);
dp[1]=items[1];//避免每次循环都判断i有没有大于1,直接做了
for(int i=2;i<dp.size();i++){
dp[i]=max(dp[i-1],dp[i-2]+items[i]);
}
//printa(items);
// printa(dp);
cout<<dp[dp.size()-1]<<endl;
}
// 64 位输出请用 printf("%lld")

京公网安备 11010502036488号