HDU 3415 Max Sum of Max-K-sub-sequence[단조로운 대기열 최적화 dp]
hh대소는 이것을 단순한 단조로운 대열 문제로 분류한다. 왜냐하면 이 상태는 이동할 필요가 없기 때문이다. 사실은 상관없다. 사고방식은 모두 똑같다.
아이디어:
단조로운 대기열은 dp가 i로 끝나는 최대 하위 세그먼트와 d[i]=max{sum[i]-sum[k]|k=[i-K, i-1]}을 최적화한다.d[i]=max(f[k])+sum[i]로 변경합니다.f[k]=-sum[k], k=[i-k, i-1]. k>=0 그리고 제목은 링입니다. 서열을 2*n으로 처리하면 됩니다.
코드:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<string>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
inline int Rint() { int x; scanf("%d", &x); return x; }
inline int max(int x, int y) { return (x>y)? x: y; }
inline int min(int x, int y) { return (x<y)? x: y; }
#define FOR(i, a, b) for(int i=(a); i<=(b); i++)
#define FORD(i,a,b) for(int i=(a);i>=(b);i--)
#define REP(x) for(int i=0; i<(x); i++)
typedef long long int64;
#define INF (1<<30)
const double eps = 1e-8;
#define bug(s) cout<<#s<<"="<<s<<" "
// dp
// i d[i] = max{ sum[i]-sum[k] | k=[i-K , i-1] }.
// d[i] = max(f[k])+sum[i]. f[k]=-sum[k], k=[i-k, i-1]. k>=0
// , , 2*n .
#define MAXN 100002*2 //
int sum[MAXN];
int f[MAXN];
int q[MAXN];
int front, tail;
int main()
{
int T = Rint();
while(T--)
{
sum[0] = 0;
int n = Rint();
int K = Rint();
FOR(i, 1, n)
{
int t = Rint();
sum[i]=sum[i-1]+t;
sum[i+n] = sum[i];
}
FOR(i, 1+n, n+n)
{
sum[i] += sum[n];
}
front = tail = 0;
f[0] = 0;
int maxd = -INF;
int st=1, en=1;
FOR(i, 1, n*2)
{
f[i] = -sum[i];
// i-1
while(front<tail && f[q[tail-1]]<f[i-1]) tail--;
q[tail++] = i-1;
// d[i]
int low = max(i-K, 0);
while(q[front]<low) front++;
int d = f[q[front]]+sum[i];
if(d>maxd)
{
maxd = d;
st = q[front]+1; // st , n
en = i>n? i-n: i;
}
}
printf("%d %d %d
", maxd, st, en);
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
깨끗한 것을 보고 싶기 때문에 최적화 함수의 벤치마크에 이용되는 함수의 가시화를 해 보았다결정되지 않음 (자기 만족) 「헤이 이런 거 있어」라고 생각하는 사람 최적화 함수란? 거친 이미지로 1) x + 10 = 25 2) x + 60 = 15 3) x + 45 = 60 의 x를 기계에 구할 때 정확하게 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.