zoukankan      html  css  js  c++  java
  • 动态规划入门 TYVJ 1305 最大子段和(环状)

    P1305 最大子序和

    时间: 1000ms / 空间: 131072KiB / Java类名: Main

    描述

    输入一个长度为n的整数序列,从中找出一段不超过M的连续子序列,使得整个序列的和最大。

    例如 1,-3,5,1,-2,3

    当m=4时,S=5+1-2+3=7
    当m=2或m=3时,S=5+1=6

    输入格式

    第一行两个数n,m
    第二行有n个数,要求在n个数找到最大子序和

    输出格式

    一个数,数出他们的最大子序和

    测试样例1

    输入

    6 4 
    1 -3 5 1 -2 3

    输出

    7

    备注

    数据范围:
    100%满足n,m<=300000

    没听懂神犇讲的什么窗口滑动,只好自己瞎造一个单调队列了......

    贴代码

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 
     7 int n,m;
     8 int head,tail;
     9 int in; 
    10 int sum,ans;
    11 int num[300010],pos[300010];
    12 
    13 int main(){
    14     scanf("%d%d",&n,&m);
    15     head=1;
    16     tail=2;
    17     for(int i=1;i<=n;i++){
    18         scanf("%d",&in);
    19         sum+=in;
    20         while(num[tail-1]>=sum&&tail>head) tail--;
    21         num[tail]=sum;
    22         pos[tail]=i;
    23         tail++;
    24         while(i-pos[head]>m) head++;
    25         ans=max(ans,sum-num[head]);
    26     }
    27     printf("%d
    ",ans);
    28     return 0;
    29 }
  • 相关阅读:
    python分布式进程
    python协程
    python线程同步
    Linux内核-链表
    java基础-003
    java基础-002
    JVM-class文件完全解析-魔数
    JVM-JDK命令行工具
    JVM-类文件结构
    Linux内核-模块编译和安装
  • 原文地址:https://www.cnblogs.com/zwube/p/6790785.html
Copyright © 2011-2022 走看看