求调斜率优化 DP
查看原帖
求调斜率优化 DP
681036
OldDriverTree楼主2023/11/21 20:01

rt,[提交记录],样例能过

思路是设 fi,jf_{i,j} 表示当前抽了 ii 发单抽,jj 发连抽,最后是连抽的最大值

fi,j=max⁡k=j−sjfi−1,k+s[(i−1)×c+j+1]−s[(i−1)×c+k]f_{i,j}=\max\limits_{k=j-s}^j f_{i-1,k}+s[(i-1)\times c+j+1]-s[(i-1)\times c+k]

#include<bits/stdc++.h>
using namespace std;
const int N=41,M=8e4+1,K=2e5+1;
int f[N][M],g[N][M],q[M];
int n,m,c,s,h,t,a[K];

int read() {
	int x=0; char c=0; while (!isdigit(c) ) c=getchar();
	while (isdigit(c) ) x=(x<<3)+(x<<1)+(c&15),c=getchar();
	return x;
}
void print(int x,int y) {
	if (!x) return;
	print(x-1,g[x][y]);
	printf("%d ",x*c+y-c+1);
}
int main()
{
	n=read(),m=read(),c=read(),s=read();
	for (int i=1;i<=c*n+m;i++) a[i]=a[i-1]+read();
	for (int i=1;i<=n;i++)
	{
		h=0,t=-1;
		for (int j=0;j<=m;j++) {
			while (h<=t&&q[h]+s<j) h++;
			while (h<=t&&f[i-1][q[t] ]-a[i*c+q[t]-c]<=f[i-1][j]-a[i*c+j-c]) t--;
			q[++t]=j,f[i][j]=f[i-1][q[h] ]+a[i*c+j-c+1]-a[i*c+q[h]-c],g[i][j]=q[h];
		}
	}
	int pos=m,ans=f[n][m];
	for (int i=0;i<m;i++) {
		int res=f[n][i]+a[c*n+m]-a[c*n+i];
		if (res>ans) ans=res,pos=i;
	}
	printf("%d\n",ans);
	print(n,pos);
	return 0;
}
2023/11/21 20:01
加载中...