火星菌

题目大意及模型转换:

现在有这样一种填数约束,在区间l..r中填a..b的数,每个数只能填一次。那么需要满足:设mid=(l+r)/2,mid2=(a+b)/2。那么1、在区间l..mid中填a..mid2,在区间mid+1..r中填mid2+1..b。2、在区间l..mid中填mid2+1..b,在区间mid+1..r中填a..mid2。现在,要求你在区间1..2^K中填1..2^K,且若在相邻两个位置填j与k,那么需要花费w[j,k]。保证w[j,k]=w[k,j]。K<=9。


水DP:

设f[i,j,k,l]表示在区间i..j填数,其中第i个数必须填k,第j个数必须填l,那么转移显然。O(2^5K)


优化DP:

可以设f[i,j]表示填前i个数,第i个数填了j。那么f[i,k]=min(f[i-1,j]),其中j与k填在i-1与i必须合法。


保证合法:

归纳可得,如果在第i-1个位置填了j,那么在第i个位置可以填的合法k是一个连续范围,且包含lowbit(i-1)个元素。那么可以设st[i,j]与en[i,j]分别表示对于lowbit为j,填了i对应的范围开头与结尾。找规律得,我们可以让i从1开始,st[i..i+j-1,j]=i+j,st[i+j..i+2*j-1,j]=i,然后将i加上2*j继续上述过程。有了st易求en。DP初值只需将f[1,i]赋值为0。

你可能感兴趣的:(dp,OI)