上海计算机学会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)
 还没有任何评论哟~ 
