• 【动态规划】求最大子段和系列问题


    知识点


    一 . 求最大子段和

    例题: 洛谷 P1115 最大子段和

    题目描述

    给出一个长度为 n 的序列 a,选出其中连续且非空的一段使得这段和最大。

    输入格式

    第一行是一个整数,表示序列的长度 n。

    第二行有 n 个整数,第 i 个整数表示序列的第 i 个数字 a_i​。

    输出格式

    输出一行一个整数表示答案。

    输入输出样例

    输入 #1

    7
    2 -4 3 -1 2 -4 3
    

    输出 #1

    4

    说明/提示

    样例 1 解释

    选取 [3, 5]子段 \{3, -1, 2\},其和为 4。

    数据规模与约定

    • 对于40% 的数据,保证 n \leqslant 2 \times 10^3
    • 对于 100% 的数据,保证 1 \leqslant n \leqslant 2 \times 10^5-10^4 \leqslant a_i \leqslant 10^4

     方法一:贪心+前缀和

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. const int maxn=1e8+9;
    7. int a[maxn];
    8. int n;
    9. int main()
    10. {
    11. long long int maxx=-0x7ffffff,ans=0;
    12. cin>>n;
    13. for(int i=0;i
    14. {
    15. cin>>a[i];
    16. ans+=a[i]; //前面i个数字相加的和进行比较与记录
    17. if(ans>maxx) maxx=ans;
    18. if(ans<0) ans=0;
    19. }
    20. cout<
    21. return 0;
    22. }

    方法二:线性动态规划

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. const int maxn=1e8+9;
    7. long long int a[maxn],Max=-0x3f3f3f3f;
    8. long long int dp[maxn];
    9. int n;
    10. int main()
    11. {
    12. cin>>n;
    13. for(int i=1;i<=n;++i)
    14. {
    15. cin>>a[i];
    16. }
    17. dp[0]=0;
    18. for(int i=1;i<=n;++i)
    19. {
    20. dp[i]=max(dp[i-1]+a[i],a[i]);
    21. //在i位置的情况可以分为:继承前面的所有数的总和+当前节点的和 或 仅选择当前节点
    22. Max=max(Max,dp[i]);
    23. }
    24. cout<
    25. return 0;
    26. }

     


    二 . 求双子序列最大和

    例题: 洛谷 P2642 双子序列最大和

    题目描述

    给定一个长度为n的整数序列,要求从中选出两个连续子序列,使得这两个连续子序列的序列和之和最大,最终只需输出最大和。一个连续子序列的和为该子序列中所有数之和。每个连续子序列的最小长度为1,并且两个连续子序列之间至少间隔一个数。

    输入格式

    第一行是一个整数表示n。

    第二行是n个整数表示整数序列。

    输出格式

    一个数,两个连续子序列的序列和之和。

    输入输出样例

    输入 #1

    5
    83 223 -13 1331 -935

    输出 #1

    1637

    输入 #2

    3
    83 223 -13

    输出 #2

    70

    说明/提示

    对于30%的数据N<=100。

    对于60%的数据有N<=10000。

    对于100%的数据有N<=1000000。

    数据保证运算过程不会超过long long(int64)。

     (待填坑)

    1. #include
    2. #include
    3. #include
    4. #include
    5. #define ll long long
    6. using namespace std;
    7. ll int n;
    8. const int maxn=1e7+5,INF=-2147483647;
    9. ll int a[maxn];
    10. ll int dp1[maxn],dp2[maxn],l[maxn],r[maxn],Max=INF;
    11. inline ll int read()
    12. {
    13. ll int x=0,f=1;
    14. char c=getchar();
    15. while(c<'0'||c>'9')
    16. {
    17. if(c=='-') f=-1;
    18. c=getchar();
    19. }
    20. while(c>='0'&&c<='9')
    21. {
    22. x=(x<<1)+(x<<3)+(c^48);
    23. c=getchar();
    24. }
    25. return x*f;
    26. }
    27. int main()
    28. {
    29. n=read();
    30. for(int i=1;i<=n;++i)
    31. {
    32. a[i]=read();
    33. }
    34. l[0]=INF; r[n+1]=INF; //记得初始化!!!
    35. for(int i=1;i<=n;++i)
    36. {
    37. dp1[i]=max(dp1[i-1]+a[i],a[i]);
    38. l[i]=max(l[i-1],dp1[i]);
    39. }
    40. for(int i=n;i>=1;--i)
    41. {
    42. dp2[i]=max(dp2[i+1]+a[i],a[i]);
    43. r[i]=max(r[i+1],dp2[i]);
    44. }
    45. for(int i=2;i<=n-1;++i)
    46. {
    47. Max=max(Max,l[i-1]+r[i+1]);
    48. }
    49. printf("%lld",Max);
    50. return 0;
    51. }

  • 相关阅读:
    Terraform 系列-Terraform Cloud 比 Terraform OSS 有哪些增强?
    自定义注解
    5G:HARQ协议
    C++:继承
    MySQL常用操作命令大全
    JSON详解
    [2023年度回顾总结]凡是过往,皆为序章
    300行代码实现Minecraft(我的世界)大地图生成
    Springboot-mybatis创建项目报错day01
    【DDPM论文解读】Denoising Diffusion Probabilistic Models
  • 原文地址:https://blog.csdn.net/gzkeylucky/article/details/126773594