1599: [Ejemplo 3] Cortar el césped (optimización de cola monótona dp)

enlace de enlace l i n k
significado de la pregunta: una longitud dennUna matriz de n , puede tomar varios segmentos de ella, y la longitud de cada segmento no puede excederKKK , ¿cuál es el valor máximo de varios segmentos?

题 解 :
dp [i] [0] = max (dp [i - 1] [0], dp [i - 1] [1]) dp [i] [0] = max (dp [i-1] [0 ], dp [i-1] [1])d p [ i ] [ 0 ]=m a x ( d p [ i-1 ] [ 0 ] ,d p [ i-1 ] [ 1 ] ) ;
dp [i] [1] = max (dp [k] [0] + suma [i] - suma [k]) dp [i] [1] = max (dp [k] [0] + suma [i] -sum [k])d p [ i ] [ 1 ]=m una x ( d p [ k ] [ 0 ]+s u m [ i ]-s u m [ k ] )其中(i - K <= k <= i) (iK <= k <= i)( yo-K<=k<=i ) ;
化 简 得 :dp [i] [1] = suma [i] - máx (dp [k] [0] - suma [k]) dp [i] [1] = suma [i] -max ( dp [k] [0] -sum [k])d p [ i ] [ 1 ]=s u m [ i ]-m una x ( d p [ k ] [ 0 ]-s u m [ k ] )其中(i - K <= k <= i) (iK <= k <= i)( yo-K<=k<=i ) ;
y dondemax (dp [k] [0] - suma [k]) max (dp [k] [0] -sum [k])m una x ( d p [ k ] [ 0 ]-s u m [ k ] ) se puede obtener empeñando la cola.

código: código: c o d e :

#include <bits/stdc++.h>
#define ll long long
#define pi pair<int,int>
#define mk make_pair
#define pb push_back
using namespace std;

const int maxn = 1e5+100;
ll a[maxn],q[maxn],sum[maxn],dp[maxn][2];
int main()
{
    
    
	int n,k;
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++)scanf("%lld",a+i),sum[i] = sum[i-1] + a[i];
	k+=1;
	int head = 1,tail = 0;
	for(int i=1;i<=n;i++)
	{
    
    
		dp[i][0] = max(dp[i-1][0],dp[i-1][1]);
		while(head <= tail && i-q[head]+1 > k)++head;
		while(head <= tail && dp[q[tail]][0] - sum[q[tail]] < dp[i][0] - sum[i])--tail;
		q[++tail] = i;
		if(i < k)dp[i][1] = sum[i];
		else dp[i][1] = sum[i] + dp[q[head]][0] - sum[q[head]];
	}
	printf("%lld\n",max(dp[n][0],dp[n][1]));
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_44499508/article/details/106734932
Recomendado
Clasificación