题解 | Boredom

Boredom

https://www.nowcoder.com/practice/8aa58d11c39e4f81911f5f9ebc687d12

#include<bits/stdc++.h>
using namespace std;
#define int long long    
vector<int>cnt(100001),dp(100001);

void solve() {
    int n;cin>>n;
    vector<int>a(n);
    int max_a=0;
    for(int i=0;i<n;i++){
        cin>>a[i];cnt[a[i]]++;
        max_a=max(max_a,a[i]);
    }
    dp[1]=cnt[1];
    for(int i=2;i<=max_a;i++)
        dp[i]=max(dp[i-1],dp[i-2]+i*cnt[i]);
    cout<<dp[max_a];
}//把相同的数放在一起当成一个整体,然后排序(当然并不是说有排序这个步骤),题目就变成了求相邻值不能选的最大和,然后需要注意的是dp[i]表示的是从最大数为i时的最大和。然后根据这个去递推状态。

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    solve();
    return 0;
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

最喜欢秋天的火龙果很...:第一份工作一定要往大的去,工资低点没事。后面换工作会更好找,即使你去小公司,你也不可能不会换工作的。所以找大的去
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务