(递推)Maximum Absurdity CodeForces - 332B

题意:有n个数,找两个不相交的长度为k的连续子区间,使得两子区间内元素和为最大

思路:现对得到的数据进行处理,求出以每个位置为结尾的长度为k的区间和,以及在该点之后最大的区间和及其位置,再进行遍历

状态转移:dp[i] = max(dp[i+1], sum[i]);//逆序
显然,代码是抄的

#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
#define LL long long
const int maxn = 2 * 1e5 +100;
LL n,k,a[maxn],sum[maxn],mx[maxn],pos[maxn],i;
int main()
{
    scanf("%lld%lld",&n,&k);
    for(i=1;i<=n;i++){
        scanf("%lld",&a[i]);
        sum[i] = sum[i-1] + a[i];
        if(i>=k) sum[i] -= a[i-k];
    }
    for(i=n;i>=k;i--){
        if(sum[i]>=mx[i+1]){
            mx[i] = sum[i];
            pos[i] = i;
        }
        else{
            mx[i] = mx[i+1];
            pos[i] = pos[i+1];
        }
    }
    LL ans = 0,pos1 = 0,pos2 = 0;
    for(i=k;i<=n;i++){
        LL sm = sum[i] + mx[i+k];
        if(ans<sm){
            ans = sm;
            pos1 = i-k+1;
            pos2 = pos[i+k]-k+1;
        }
    }
    printf("%lld %lld\n",pos1,pos2);
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,788评论 0 33
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,426评论 0 2
  • 各校历年复试机试试题 清华、北大、华科试题详细笔记部分,少笔记部分与少数leetcode【含个人整理笔记】 一、详...
    医学工程与科学园地阅读 1,233评论 0 1
  • 《程序员代码面试指南-左程云》笔记 第一章 栈和队列 设计一个有getMin功能的栈 实现一个特殊的栈,在实现栈的...
    xiaogmail阅读 18,511评论 2 19
  • 思乡,离别,久别重逢是最容易引起悲喜交加导致失眠难梦的际遇,今夜我失眠了,看看时间是午夜子时。 昨天...
    水底石阅读 531评论 0 1