NOI2025DP专题1

NOI2025DP专题1

开题顺序: \(A\)

\(A\) CF1342F Make It Ascending

  • 难点在于信息合并,一个比较暴力的做法是迭代加深后多次背包维护决策。

  • 记录匹配成功后的极值或许可做。仔细思索后记录最大值实质是在类似区间 \(DP\) 一样合并,但如果始终抓着原始序列考虑合并怎么做没什么前程。

  • \(f_{i,j,S}\) 表示结果序列 \([1,i]\) 中,被使用的元素构成的集合为 \(S\)\(i\)\(j\) 为初始值合并而来的最小值。刷表转移并记录路径。

    点击查看代码
    const int inf=0x3f3f3f3f;
    struct node
    {
    	int len,pos,s;// pos 作了移位处理
    }opt[20][20][(1<<15)+10],ans;
    int a[20],p[20],sum[(1<<15)+10],f[20][20][(1<<15)+10],n;
    int lowbit(int x)
    {
    	return (x&(-x));
    }
    void print(node x)
    {
    	int len=x.len,pos=x.pos,s=x.s;
    	if(len==0)  return;
    	int t=s^opt[len][pos][s].s;
    	for(int i=0;i<n;i++)
    	{
    		if(((t>>i)&1)==1&&i!=pos-1)
    		{
    			cout<<p[i]<<" "<<p[pos-1]<<endl;
    			for(int j=i+1;j<n;j++)  p[j]--;
    		}
    	}
    	print(opt[len][pos][s]);
    }
    int main()
    {
    // #define Isaac
    #ifdef Isaac
    	freopen("in.in","r",stdin);
    	freopen("out.out","w",stdout);
    #endif
    	int testcase,m,s,t,_s,i,j;
    	cin>>testcase;
    	for(;testcase>=1;testcase--)
    	{
    		cin>>n;  m=(1<<n)-1;  ans=(node){-1,-1,-1};
    		for(i=0;i<n;i++)  
    		{
    			cin>>a[i];  p[i]=i+1;
    		}
    		for(i=1;i<=m;i++)  sum[i]=sum[i-lowbit(i)]+a[__builtin_ctz(i)];
    		for(i=0;i<=n;i++)
    		{
    			for(j=0;j<=n;j++)  fill(f[i][j]+0,f[i][j]+m+1,inf);
    		}
    		f[0][0][0]=0;
    		for(i=0;i+1<=n;i++)  for(j=0;j+1<=n;j++)  for(s=0;s<=m;s++)
    		{
    			if(f[i][j][s]!=inf)
    			{
    				_s=m^s;
    				for(t=_s;t!=0;t=_s&(t-1))
    				{
    					if(sum[t]>f[i][j][s]&&(t>>j)!=0)
    					{
    						f[i+1][j+1+__builtin_ctz(t>>j)][s|t]=min(sum[t],
    								f[i+1][j+__builtin_ctz(t>>j)+1][s|t]);
    						if(f[i+1][j+1+__builtin_ctz(t>>j)][s|t]==sum[t])
    							opt[i+1][j+__builtin_ctz(t>>j)+1][s|t]=(node){i,j,s};
    					}
    				}
    			}
    		} 
    		for(i=n;i>=0&&ans.len==-1;i--)
    		{
    			for(j=1;j<=n;j++)
    			{
    				if(f[i][j][m]!=inf)
    				{
    					ans=(node){i,j,m}; 
    					break;
    				}
    			}
    		}
    		cout<<n-ans.len<<endl;
    		print(ans);
    	}
    	return 0;
    }
    

\(B\) CF1239E Turtle

\(C\) luogu P6806 [CEOI 2020] 象棋世界

\(D\) CF613E Puzzle Lover

\(E\) CF1466H Finding satisfactory solutions

\(F\) CF582D Number of Binominal Coefficients

\(G\) [AGC034E] Complete Compress

\(H\) [AGC020E] Encoding Subsets

\(I\) [AGC036D] Negative Cycle

\(J\) [AGC028D] Chords

\(K\) [AGC022F] Checkers

\(L\) UOJ 607. 【UR #20】跳蚤电话

\(M\) UOJ 181. 【UR #12】密码锁

\(N\) UOJ 370. 【UR #17】滑稽树上滑稽果

\(O\) UOJ 312. 【UNR #2】梦中的题面

posted @ 2025-04-17 10:18  hzoi_Shadow  阅读(261)  评论(0)    收藏  举报
扩大
缩小