1 条题解

  • 0
    @ 2026-8-20 14:57:58

    考验对条件的刻画吧,这种题 zfr 估计随便秒。

    考虑刻画一个人集邮的路线,其必然是形如:

    1. 先造出来一条从 0n+10\to n+1 的上行路线。
    2. 每次添加一个环 (l,r)(l,r),表示其在 rr 处转移到了下行路线,然后在 ll 处再转移回来,后文记所有 ll 的可重集为 XX,所有 rr 的可重集为 YY
    3. 对于路上的每个 iX,iYi\ne X,i\ne Y,其会向距离最近的一个位置进行连边,这样才能收集到 ii

    然后你发现答案只和 X,YX,Y 有关,对于一对 (X,Y)(X,Y) 可行的充要条件,考虑 X,YX,Y 的构造是两两匹配的形式,显然就是每一段前缀 XX 的个数都大于等于 YY

    那么 DP 状态里面只需要记 XY|X|-|Y| 即可,状态就是 fi,jf_{i,j} 表示到第 ii 位,当前 XY=j|X|-|Y|=j,显然 maxj=O(n)\max j=O(n),随便转移一下,时间复杂度是 O(n2)O(n^2) 的。

    ::::info[code]

    const int N=3e3+5;
    int n,l;
    int f[N][N];
    int u[N],v[N],d[N],e[N];
    int main(){
    	n=read(),l=read();
    	for(int i=1;i<=n;i++)u[i]=read(),v[i]=read(),d[i]=read(),e[i]=read();
    	memset(f,0x3f,sizeof f);
    	f[0][0]=(n+1)*l;
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++)
    			chkmin(f[i][j],f[i-1][j-1]+d[i]+v[i]);
    		for(int j=0;j< n;j++)
    			chkmin(f[i][j],f[i-1][j+1]+e[i]+u[i]);
    		for(int j=1;j<=n;j++)
    			chkmin(f[i][j],f[i][j-1]+d[i]+v[i]);
    		for(int j=n-1;j;j--)
    			chkmin(f[i][j],f[i][j+1]+e[i]+u[i]);
    		for(int j=0;j<=n;j++)
    			chkmin(f[i][j],f[i-1][j]+u[i]+v[i]);
    		for(int j=1;j<=n;j++)
    			chkmin(f[i][j],f[i-1][j]+d[i]+e[i]);
    		for(int j=1;j<=n;j++)
    			f[i][j]+=2*l*j;
    	}
    	printf("%d\n",f[n][0]);
    }
    

    ::::

    • 1

    [JOISC 2014] 邮戳收集 / Collecting Stamps

    信息

    ID
    5909
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者