Advertisement

上海计算机学会2024年10月月赛C++乙组T1链的独立集

阅读量:

链的独立集

内存限制: 256 Mb时间限制: 1000 ms

题目描述

给定 n 个数字构成的序列 a1​,a2​,a3​,…,an​,请从中挑选一些数字构成一个独立集。所谓独立集就是原数列的一部分数字,且这些数字在原数列中均不相邻。找出数字之和最大的独立集,输出这些数字的和。注意若数字都是负数,可以不挑任何数,此时输出 0

输入格式
  • 第一行:单个整数 n
  • 第二行:n 个整数 a1​,a2​,…,an​
输出格式
  • 单个整数:表示最大的独立集
数据范围
  • 对于 30% 的数据,1≤n≤20;
  • 对于 60% 的数据,1≤n≤3,000;
  • 对于 100% 的数据,1≤n≤100,000;
  • −10000≤ai​≤10000
样例数据

输入:
5
10 20 30 -10 3
输出:
43

解析:使用动态规划,详见代码:

复制代码
 #include <bits/stdc++.h>

    
 using namespace std;
    
 int n;
    
 int a[100005];
    
 //dp[i][0]表示不取当前数的和的最大值
    
 //dp[i][1]表示取当前数的和的最大值
    
 long long dp[100005][2];
    
 long long ans = 0; //答案最小默认为0
    
 int main() {
    
     cin >> n;
    
     for(int i = 1; i <= n; i++) {
    
     cin >> a[i];
    
     }
    
     for(int i = 1; i <= n; i++) {
    
     //当前位置不选,取上个位置选和不选的最大值
    
     dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]);
    
     //当前位置选,则上个位置不能选
    
     dp[i][1] = max(dp[i - 1][0], dp[i - 1][0] + a[i]);
    
     //取最大值
    
     ans = max(ans, max(dp[i][0], dp[i][1]));
    
     }
    
     cout << ans;
    
     return 0;
    
 }
    
    
    
    
    AI写代码

全部评论 (0)

还没有任何评论哟~